我实现了一个Java EE安全领域,如果用户试图访问受保护的资源,该领域会将用户重定向到login.jsp。
- 假设用户想要转到一个受保护的url-
http://mywebapp/shopping_cart
,该url映射到ShoppingCartServlet - 由于他们没有登录,Glassfish将他们引导到login.jsp
- 然后,他们输入用户名和密码,然后单击"登录",信息将被张贴到
http://mywebapp/j_security_check
- 如果他们输入了正确的详细信息,那么他们将被重定向到处理url
http://mywebapp/shopping_cart
的servlet
现在我想从数据库中提取用户的详细信息,但当重定向请求中没有参数时,我该怎么做?
他们的用户名被发送到http://mywebapp/j_security_check
,但j_security_check向http://mywebapp/shopping_cart
发出的重定向请求中没有参数。那么,一旦用户登录,使用什么方法来访问他们的详细信息呢?
创建一个过滤器,用于检查用户是否已登录,而会话中不存在来自数据库的关联User
对象。然后,只需加载数据并放入会话。
基本上,
@WebFilter("/*")
public class UserFilter implements Filter {
@EJB
private UserService service;
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
String remoteUser = request.getRemoteUser();
if (remoteUser != null) {
HttpSession session = request.getSession();
if (session.getAttribute("user") == null) {
User user = service.find(remoteUser);
session.setAttribute("user", user);
}
}
chain.doFilter(req, res);
}
// ...
}