java会话管理

Cas*_*sey 3 java servlets java-ee

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

    HttpSession session = request.getSession(true);
    if (session.isNew() == false) {
        session.invalidate();
        session = request.getSession (true);
    }
Run Code Online (Sandbox Code Playgroud)

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

    HttpSession session = request.getSession(false);
    if (session == null) {
        throw new ServletException ("No session.");
    }
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢!

Bal*_*usC 8

这毫无意义.忘了request.getSession(boolean).只需获取会话request.getSession(),从不担心空值/有效性.

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

request.getSession().setAttribute("test", "foo");
Run Code Online (Sandbox Code Playgroud)

和在test2(这是在被请求的过程相同会话之后 test1):

String test = (String) request.getSession().getAttribute("test"); // Returns "foo".
Run Code Online (Sandbox Code Playgroud)

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

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

然后在Filter映射到url-pattern代表限制区域的a中,只需检查是否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.
}
Run Code Online (Sandbox Code Playgroud)

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

request.getSession().removeAttribute("user");

// Or, more drastically:
request.getSession().invalidate();
Run Code Online (Sandbox Code Playgroud)

另外,您还可以看看的声明安全管理集装箱在一些简单的条目的帮助web.xmlserver.xml.这样您就不必为自己的登录/过滤逻辑烦恼了.

  • 完全:)你可以使用例如`/ protected/*`,`/ secured/*`,`/ admin/*`等的`url-pattern`并将内容放在那里.这也是容器管理安全性应该工作的方式.祝好运. (2认同)