【问题标题】:use one session attribute for different servlets对不同的 servlet 使用一个会话属性
【发布时间】:2015-10-21 09:13:07
【问题描述】:

我已经为用户创建了一个登录环境,我已经从数据库中检索了用户名和密码以进行登录。并将用户名设置为会话中的字符串。现在我想为另一个 servlet 使用相同的用户名。但是我不能在两个 servlet 中使用相同的字符串。如何为另一个 servlet 使用相同的会话属性。下面是我的代码。 loginservlet

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
@WebServlet(urlPatterns = {"/LoginServlet"})
public class LoginServlet extends HttpServlet {

String userid, pwd;

protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    Connection connection = null;
    Statement statement = null;

    userid = request.getParameter("uname");
    pwd = request.getParameter("pass");
    try {
        dbconnector dbc = new dbconnector();
        connection = dbc.Open();
        PreparedStatement ps = connection.prepareStatement("select * from member where uname='" + userid + "' and pass='" + pwd + "'");

        ResultSet rs = ps.executeQuery();
        if (rs.next()) {
            HttpSession session = request.getSession();
            session.setAttribute("userid", userid);
            //out.println("welcome " + userid);
            //out.println("<a href='logout.jsp'>Log out</a>");
            response.sendRedirect("success.jsp");
        } else {

            request.setAttribute("errorMessage", "Invalid user or password");
            RequestDispatcher rd = getServletContext().getRequestDispatcher("/index.jsp");
            rd.include(request, response);

        }

    } catch (Exception e) {
        e.printStackTrace();
    }

}
}

profile servlet这里我要使用会话值userid

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;


@WebServlet(urlPatterns = {"/usesesvaluegetdbdata"})
public class usesesvaluegetdbdata extends HttpServlet {

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
      Connection connection = null;
    Statement statement = null;
    String userid;

    try {
        dbconnector dbc = new dbconnector();
        connection = dbc.Open();
        PreparedStatement ps = connection.prepareStatement("select eid,ename from member where uname='" + userid + "' and pass='" + pwd + "'");



    } catch (Exception e) {
        e.printStackTrace();
    }

}

【问题讨论】:

  • session.getAttribute("userid") 怎么样?
  • 提示:当您顽固地直接在 SQL 字符串中字符串连接查询参数而不是使用 PreparedStatement 类的特殊 setXxx() 方法时,PreparedStatement 无法防止 SQL 注入攻击。
  • 关于你的具体问题,“但我不能在两个servlet中使用相同的字符串”,能否请您详细说明“不能”?即没有技术限制,所以这一定是用户/开发人员的限制,但你没有详细说明。

标签: java session servlets


【解决方案1】:

在第一个servlet 中,您将值存储在session 中。

HttpSession session = request.getSession();
session.setAttribute("userid", userid);

同样,您需要在第二个servlet 中从session 中检索这些值

HttpSession session = request.getSession();
String userid=(String)session.getAttribute("userid");//cast to String, default its Object

现在在第二个servlet 中使用这个userid 变量。

HttpSession#getAttribute()

preparestatement这样操作避免sql注入

session

【讨论】:

    【解决方案2】:

    在 'profile' servlet 中,您可以使用以下方法查找 HttpSession。

    HttpSession httpSession = request.getSession(false);

    'false' 将确保您在登录 servlet 之前调用配置文件 servlet 时不会创建新会话。

    获得会话后,您可以读取之前存储的属性值。

    【讨论】:

      【解决方案3】:

      你说我不能用是什么意思?

      如果您想在其他 servlet 中使用存储值,请执行此操作 HttpSession 会话 = request.getSession(); String user= session.getAttribute("userid");

      如果你想使用相同的键(“userid”)来设置新值 你不能这样做,因为会话范围在任何地方都是通用的,即使你创建了新的会话对象,你在后台使用相同的会话,所以你应该选择新的字符串。

      【讨论】:

        【解决方案4】:

        试试这个....

        import java.io.IOException;
        import java.io.PrintWriter;
        import javax.servlet.ServletException;
        import javax.servlet.annotation.WebServlet;
        import javax.servlet.http.HttpServlet;
        import javax.servlet.http.HttpServletRequest;
        import javax.servlet.http.HttpServletResponse;
        import java.io.*;
        import javax.servlet.*;
        import javax.servlet.http.*;
        import java.sql.*;
        
        @WebServlet(urlPatterns = {"/LoginServlet"})
        public class LoginServlet extends HttpServlet {
        
            String userid, pwd;
        
            protected void doPost(HttpServletRequest request, HttpServletResponse response)
                    throws ServletException, IOException {
                response.setContentType("text/html;charset=UTF-8");
                PrintWriter out = response.getWriter();
                Connection connection = null;
                Statement statement = null;
        
                userid = request.getParameter("uname");
                pwd = request.getParameter("pass");
        
            try {
                HttpSession session = request.getSession(true);//true if first session else use false
                if (SessionManager.checkUserSession(session)) {
                    dbconnector dbc = new dbconnector();
                    connection = dbc.Open();
                    PreparedStatement ps = connection.prepareStatement("select * from member where uname='" + userid + "' and pass='" + pwd + "'");
        
                    ResultSet rs = ps.executeQuery();
                    if (rs.next()) {
        
                        session.setAttribute("userid", userid);
                        //out.println("welcome " + userid);
                        //out.println("<a href='logout.jsp'>Log out</a>");
                        response.sendRedirect("success.jsp");
                    } else {
        
                        request.setAttribute("errorMessage", "Invalid user or password");
                        RequestDispatcher rd = getServletContext().getRequestDispatcher("/index.jsp");
                        rd.include(request, response);
        
                    }
                }
                request.setAttribute("statuscode", "HTTP_STATUS_INVALID_SESSION");
            } catch (Exception e) {
                e.printStackTrace();
            }
        
        }
        

        }

        会话管理器的代码

        public class SessionManager {
        
            public static boolean checkUserSession(HttpSession loginSession) {
                if ((loginSession == null) || (loginSession.toString().isEmpty())) {
                    return false;
                } else if (loginSession.isNew()) {
                    return false;
                } else {
                    return true;
                }
            }
        }
        

        用于更改用户名或访问它使用

        HttpSession session = request.getSession();
        String userid=(String)session.getAttribute("userid"); 
        

        【讨论】:

          【解决方案5】:

          首先像这样将值存储在会话中

          HttpSession session = request.getSession();
          session.setAttribute("userid", userid);
          

          像这样访问会话值

            HttpSession session=request.getSession();
            String username = session.getAttribute("userid").toString() ;
          

          【讨论】:

            猜你喜欢
            • 2014-10-18
            • 1970-01-01
            • 2019-07-06
            • 1970-01-01
            • 2013-07-02
            • 1970-01-01
            • 2013-03-26
            • 2012-12-07
            • 2011-12-23
            相关资源
            最近更新 更多