代码之家  ›  专栏  ›  技术社区  ›  Casey

Java会话管理

  •  3
  • Casey  · 技术社区  · 15 年前

    我正在为一个小的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。我的计划是最终创建一个登录页面来创建会话,但是我在这里看到的问题仍然存在。

    我该怎么办?我希望有任何不包括第三方图书馆的想法。我这样做是为了学习。

    谢谢!

    3 回复  |  直到 15 年前
        1
  •  8
  •   BalusC    15 年前

    这没有道理。忘掉 request.getSession(boolean) . 只需通过 request.getSession() 不要担心空虚/勇敢。

    如果您想通过会话属性传递数据,那么只需在 test1 以下内容:

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

    而在 test2 (这当然是在 相同的 阶段 之后 测试1 ):

    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 它代表禁区,只需检查 用户 是否存在:

    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.
    }
    

    当您注销时,只需删除 用户 会议内容:

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

    或者,您也可以查看声明性 Container Managed Security 借助于 web.xml 以及 server.xml . 这样,您就不需要自己去麻烦登录/过滤逻辑了。

        2
  •  3
  •   John Topley    15 年前

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

    在测试1中,执行以下操作:

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

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

    HttpSession session = request.getSession();
    if (session.getAttribute("test1") == null){
        response.sendRedirect("test1");
        return;
    }
    
        3
  •  3
  •   Arjan Tijms UML GURU    11 年前

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

    JavaEE和servlet规范处理所有的登录信息,重定向到登录页面等等。阅读JavaEE的内置功能。也许开始吧 here .

    推荐文章