您可以Filter
为此使用 a 。这样,您可以将代码逻辑保存在一个地方,而无需在所有 JSP 页面上不必要地复制粘贴相同的代码,并且它还可以很好地保持 JSP 无脚本。
您也可以只使用 Java EE 提供的HttpSession
API,而不是通过自己创建 cookie 来重新发明会话。这基本上已经由 cookie 支持,您可以将 Java 对象作为属性存储在会话中,以便它们在整个用户会话中保持可用。
登录时只需将User
对象放入HttpSession
:
User user = userDAO.find(username, password);
if (user != null) {
request.getSession().setAttribute("user", user);
} else {
// Show error.
}
要检查用户是否已登录,请使用Filter
. 实现doFilter()
方法如下:
if (((HttpServletRequest) request).getSession().getAttribute("user") != null) {
chain.doFilter(request, response); // User is logged in, just continue with request.
} else {
((HttpServletResponse) response).sendRedirect("login"); // Not logged in, redirect to login page.
}
并将其映射到url-pattern
like /secured
、/restricted
或/users
so 上。将需要限制的 JSP 页面也放在 webcontent 的同一个文件夹中。
要注销用户,只需将其从会话中删除:
request.getSession().removeAttribute("user");
// Or, more drastically, invalidate the entire session:
request.getSession().invalidate();
也就是说,Java EE 已经提供了声明式(基于 xml-config)容器管理的安全性,您可以在此处找到有关它的教程。你可以使用它,但是如果你想让你的应用程序独立地拦截容器管理的登录,例如保持对登录历史的概述,那么你仍然需要创建一个Filter
. 例如:
HttpServletRequest httpRequest = (HttpServletRequest) request;
UserPrincipal user = httpRequest.getUserPrincipal();
HttpSession session = httpRequest.getSession();
if (user != null && session.getAttribute("user") == null) {
session.setAttribute("user", user);
// First-time login. You can do your intercepting thing here.
}
chain.doFilter(request, response);