Java 为不同的servlet使用一个会话属性
我为一个用户创建了一个登录环境,从数据库中检索用户名和密码进行登录。并在会话中将用户名设置为字符串。现在我想对另一个servlet使用相同的用户名。但我不能在两个servlet中使用相同的字符串。如何对另一个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
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中使用相同的字符串”,您能详细说明“不能”吗?没有技术限制,所以这一定是用户/开发人员的限制,但您没有详细说明。