Java 为不同的servlet使用一个会话属性

Java 为不同的servlet使用一个会话属性,java,session,servlets,Java,Session,Servlets,我为一个用户创建了一个登录环境,从数据库中检索用户名和密码进行登录。并在会话中将用户名设置为字符串。现在我想对另一个servlet使用相同的用户名。但我不能在两个servlet中使用相同的字符串。如何对另一个servlet使用相同的会话属性。下面是我的代码。 loginservlet import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax

我为一个用户创建了一个登录环境,从数据库中检索用户名和密码进行登录。并在会话中将用户名设置为字符串。现在我想对另一个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();
    }

}
}

在第一个
servlet
中,您将值存储在
会话中

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
变量

如下所示以避免sql注入


在“概要文件”servlet中,您可以使用以下方法查找HttpSession

HttpSession HttpSession=request.getSession(false)

“false”将确保在登录servlet之前调用概要文件servlet时,不会创建新会话


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

我不能使用是什么意思

如果您想在其他servlet中使用存储的值,请执行以下操作 HttpSession session=request.getSession(); 字符串user=session.getAttribute(“userid”)

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

试试这个

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();
    }

}
要更改用户名或访问它,请使用

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

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

HttpSession session = request.getSession();
session.setAttribute("userid", userid);
  HttpSession session=request.getSession();
  String username = session.getAttribute("userid").toString() ;
像这样访问会话值

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

如何
session.getAttribute(“userid”)
?提示:PreparedStatement无法阻止SQL注入攻击,如果您不使用PreparedStatement类的特殊setXxx()方法,而是顽固地将查询参数直接串接在SQL字符串中,“但是我不能在两个servlet中使用相同的字符串”,您能详细说明“不能”吗?没有技术限制,所以这一定是用户/开发人员的限制,但您没有详细说明。