gpt4 book ai didi

java - HttpSession 与 2 个不同请求的问题

转载 作者:行者123 更新时间:2023-11-30 02:09:31 25 4
gpt4 key购买 nike

我正在开发一个基于 Java 的后端,但在管理用户 session 时遇到了麻烦。

我想在 session 中为每个用户存储一些个人信息,因此我实现了一个用于登录目的的 Servlet,如果登录成功,它会创建一个 session :

    @WebServlet("/LoginUserWithPassword")
@MultipartConfig(fileSizeThreshold = 1024 * 1024 * 2, // 2MB
maxFileSize = 1024 * 1024 * 10, // 10MB
maxRequestSize = 1024 * 1024 * 50) // 50MB
public class LoginUserWithPassword extends HttpServlet {
private static final long serialVersionUID = 1L;
static Logger log = Logger.getLogger(LoginUserWithPassword.class);


protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");


....
HttpSession session = request.getSession();
session.getServletContext().getContext("/{applicationContextRoot}").setAttribute("nom",usr.nom);
session.getServletContext().getContext("/{applicationContextRoot}").setAttribute("prenom", usr.prenom);
session.getServletContext().getContext("/{applicationContextRoot}").setAttribute("login", usr.email);
session.getServletContext().getContext("/{applicationContextRoot}").setAttribute("id", String.valueOf(usr.id_user));
session.getServletContext().getContext("/{applicationContextRoot}").setAttribute("id_right",String.valueOf(ur.id_right));
session.getServletContext().getContext("/{applicationContextRoot}").setAttribute("right",url.right);
session.getServletContext().getContext("/{applicationContextRoot}").setAttribute("session",session.getId());

然后,在客户端(JSP/Javascript),我检索 session 信息。

考虑一个 user1,他使用以下 Javascript 代码在浏览器 (Chrome) 上成功登录:

Glogin = '<%= (String) (request.getSession().getServletContext().getContext("/{applicationContextRoot}").getAttribute("login")) %>';
Gsession = '<%= (String) (request.getSession().getServletContext().getContext("/{applicationContextRoot}").getAttribute("session")) %>';

console.log("login from session: "+Glogin);
console.log("Session ID: "+Gsession);

我可以看到以下控制台日志:

login from session: admin3@toto.com
Session ID: 7D6638EA7167580F4C1BD4D51FAD3C9C

然后,我使用另一个浏览器 (FF) 在同一台计算机上执行 user2 的第二次登录,控制台日志中有以下内容:

login from session: admin@toto.com
Session ID: 376C57F6ACB08CD3B66AB8406DB72984

在那个阶段一切都很完美,我可以在每个 session 上检索我各自的属性,但是如果我刷新 user1 的浏览器,我会检索用户 2 的 session ID......并丢失我的 user1 session 上下文。

你知道我为什么会出现这样的行为吗?可能是我实现 session 管理的方式不正确?

最佳答案

您没有正确使用 session 。将所有地方的 session.getServletContext().getContext("/{applicationContextRoot}") 替换为 session 。 Servlet 上下文是全局的(共享)。

关于java - HttpSession 与 2 个不同请求的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50516010/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com