在一个Java Servlet中,我想通过程序来检查用户是否已经登录。
在一个Java Servlet中,我想通过程序来检查用户是否已经登录。
正如其他答案所指出的那样,HttpServletRequest#getUserPrincipal()
仅适用于使用Java EE提供的容器管理安全性的情况,如此处所述。
如果您正在开发自己的安全措施,那么您需要依靠HttpSession
。这并不难,以下是每个步骤需要实现的概述:
在登录时,从数据库中获取User
并在servlet的doPost()
中将其存储在会话中:
User user = userDAO.find(username, password);
if (user != null) {
session.setAttribute("user", user);
} else {
// Show error like "Login failed, unknown user, try again.".
}
在注销时,只需在servlet的doPost()
中使会话无效。它将销毁会话并清除所有属性。
session.invalidate();
url-pattern
相映射,该模式覆盖了受限页面,例如/secured/*
,/protected/*
等,并实现以下的doFilter()
方法:if (session.getAttribute("user") == null) {
response.sendRedirect(request.getContectPath() + "/login"); // Not logged in, redirect to login page.
} else {
chain.doFilter(request, response); // Logged in, just continue chain.
}
基本上就是这样了。
Java Servlet 3.1规范(第13.10节)指出:
在请求处理期间登录应用程序,恰好对应于与请求相关联的有效的非空调用者身份,可以通过调用请求上的
getRemoteUser
或getUserPrincipal
来确定。这些方法中任何一个返回null
都表示调用者在请求处理方面未登录应用程序。
chain.doFilter(request, response);
这里的 chain 是什么? - user63762453