java会话管理

我正在使用一个小型webapp来获取乐趣,目前仅使用Java Servlet。 我有两个页面,test1和test2。 目前我在test1中创建一个新会话,如下所示:

HttpSession session = request.getSession(true); if (session.isNew() == false) { session.invalidate(); session = request.getSession (true); } 

在test2中,我正在检索会话,如下所示:

  HttpSession session = request.getSession(false); if (session == null) { throw new ServletException ("No session."); } 

所以问题是如果我先去test2,我总是得到一个有效的会话,因为浏览器会创建一个。 我想限制从test1到test2的流程,所以我必须先进入test1。 我的计划是最终创建一个创建会话的登录页面,但我在这里看到的问题仍然存在。

我该怎么处理? 我想任何想法都不包括第三方库。 我这样做是为了学习练习。

谢谢!

这毫无意义。 忘记request.getSession(boolean) 。 只需通过request.getSession()获取会话,从不担心nullness / validness。

如果要通过会话属性传递数据,那么只需在test1

 request.getSession().setAttribute("test", "foo"); 

并且在test2 (当然 test1 之后同一会话中请求):

 String test = (String) request.getSession().getAttribute("test"); // Returns "foo". 

编辑:至于使用会话检查登录User ,只需执行登录代码中的操作:

 User user = userDAO.find(username, password); if (user != null) { request.getSession().setAttribute("user", user); } else { // Show error? } 

然后在映射到代表限制区域的url-patternFilter中,只检查User是否存在:

 if (((HttpServletRequest) request).getSession().getAttribute("user") != null) { chain.doFilter(request, response); // Just continue. } else { ((HttpServletResponse) response).sendRedirect("login"); // Not logged-in, redirect to login page. } 

当您注销时,只需从会话中删除User

 request.getSession().removeAttribute("user"); // Or, more drastically: request.getSession().invalidate(); 

或者,您还可以借助web.xmlserver.xml的一些简单条目来查看声明性容器管理安全性 。 这样您就不需要自己处理登录/过滤逻辑。

如果要限制流以确保test1在test2之前出现,请让test1在会话中放置一个属性值,说明它已被访问过,并在test2中测试该属性值。 如果该值不存在,请将test2重定向到test1。

在test1中,执行以下操作:

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

然后,在test2中,您可以这样做:

 HttpSession session = request.getSession(); if (session.getAttribute("test1") == null){ response.sendRedirect("test1"); return; } 

会话只是一个空头的篮子。 用户是否经过身份validation的概念与用户是否具有会话是分开的。

Java EE和servlet规范为您处理所有登录内容,重定向到登录页面等等。 阅读Java EE的内置function。 也许从这里开始。