java会话管理
为了好玩,我正在开发一个小的webapp,目前只使用javaservlet。我有两个页面,test1和test2。目前,我正在test1中创建一个新会话,如下所示: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);
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模式,等等,然后将内容放在那里。这也是容器管理的安全性的工作方式。祝你好运。我想我可能用错了这里的会话。我正在尝试限制页面流量,稍后将创建一个登录页面,我认为,该页面将使当前会话无效,并创建一个新会话?感谢链接,我肯定会阅读这篇文章。