3

我正在开发一个有趣的小型 web 应用程序,目前仅使用 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。我的计划是最终创建一个将创建会话的登录页面,但我在这里看到的问题仍然存在。

我该如何处理?我希望任何不包括 3rd 方库的想法。我这样做是为了学习。

谢谢!

4

4 回答 4

9

这是没有意义的。忘记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代表限制区域的 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.
}

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

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

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

或者,您也可以借助. 这样您就不需要自己为登录/过滤逻辑而烦恼。web.xmlserver.xml

也可以看看:

于 2009-12-02T21:05:35.400 回答
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;
}
于 2009-12-02T21:05:29.877 回答
3

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

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

于 2009-12-02T21:08:29.450 回答
-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){}

于 2021-07-22T06:02:23.027 回答