java会话管理

java会话管理,java,servlets,jakarta-ee,Java,Servlets,Jakarta Ee,为了好玩,我正在开发一个小的webapp,目前只使用javaservlet。我有两个页面,test1和test2。目前,我正在test1中创建一个新会话,如下所示: HttpSession session = request.getSession(true); if (session.isNew() == false) { session.invalidate(); session = request.getSession (true);

为了好玩,我正在开发一个小的webapp,目前只使用javaservlet。我有两个页面,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。我的计划是最终创建一个登录页面来创建会话,但是我在这里看到的问题仍然存在

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


谢谢

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

这毫无意义。忘记
请求.getSession(布尔值)
。只需通过
request.getSession()
获取会话,而不必担心空值/有效性

如果要通过会话属性传递数据,只需在
test1
中执行以下操作:

request.getSession().setAttribute("test", "foo");
String test = (String) request.getSession().getAttribute("test"); // Returns "foo".
test2
中(当然,在
test1
之后的相同的会话中会请求它):

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

User user = userDAO.find(username, password);
if (user != null) {
    request.getSession().setAttribute("user", user);
} else {
    // Show error?
}
然后,在映射到表示受限区域的
url模式
的中,只需检查
用户
是否存在:

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();

或者,您也可以借助
web.xml
server.xml
中的一些简单条目来查看声明性。这样,您就不需要自己处理登录/筛选逻辑了。

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


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

我不只是考虑来回传递数据,而是将其用作一种安全机制。也许我完全错误地使用了会话?谢谢。这就是我要做的。为了让这更容易,我可能应该把我所有的“受限”内容放在一个子源文件夹中,这样我就可以将过滤器应用到整个内容中。确切地说:)例如,你可以使用
/protected/*
/securited/*
/admin/*
,的
url模式,等等,然后将内容放在那里。这也是容器管理的安全性的工作方式。祝你好运。我想我可能用错了这里的会话。我正在尝试限制页面流量,稍后将创建一个登录页面,我认为,该页面将使当前会话无效,并创建一个新会话?感谢链接,我肯定会阅读这篇文章。