【发布时间】:2018-11-04 01:47:39
【问题描述】:
我正在开发基于 Java 的后端,但在管理用户会话时遇到了麻烦。
我想在会话中为每个用户存储一些个人信息,因此我实现了一个用于登录目的的 Servlet,如果登录成功,它会创建一个会话:
@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),我正在检索会话信息。
考虑一个 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
在那个阶段一切都很完美,我可以在每个会话中检索我各自的属性,但是如果我刷新用户 1 的浏览器,我会检索用户 2 的会话 ID ....并丢失我的用户 1 会话上下文。
你知道我为什么会出现这种行为吗?可能是我实现会话管理的方式不正确?
【问题讨论】: