java会话管理

时间:2009-12-02 20:59:37

标签: 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);
    }

在test2中,我正在检索会话:

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

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

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

谢谢!

4 个答案:

答案 0 :(得分:8)

这没有任何意义。忘记request.getSession(boolean)。只需通过request.getSession()获取会话,就不必担心空值/有效性。

如果要通过会话属性传递数据,请执行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?
}

然后在Filter映射到代表受限区域的url-pattern上,只需检查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中的一些简单条目来查看声明式Container Managed Security。这样您就不需要自己使用登录/过滤逻辑了。

答案 1 :(得分:3)

如果要限制流以确保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;
}

答案 2 :(得分:3)

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

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

答案 3 :(得分:-1)

当有人使用正确的凭据登录时,使用此设置分离 request.getSession().setAttribute("user", "user");

现在,您可以使用此签入此会话用户是否已经存在

if (((HttpServletRequest) request).getSession().getAttribute("user") != null)

并且您可以在注销时删除会话

request.getSession().invalidate();

这项工作完美

注意: 像这样导入 HttpServletRequest 并传递请求参数

import javax.servlet.http.HttpServletRequest;

public home(HttpServletRequest request){}