我的项目有一个模板main.xhtml
和三个视图login.xhtml
、dashboard.xhtml
、new.xhtml
。一旦我登录login.xhtml
,LoginBean
将验证,如果成功,则需要dashboard.xhtml
。如果用户需要创建新记录,请单击新按钮,这将new.xhtml
。
但问题是,如果直接从浏览器请求dashboard.xhtml
,那么它无需登录即可工作。我是否需要检查用户登录的每个视图?我怎样才能做到这一点?
听起来好像您正在家庭开发身份验证。在这种情况下,您还需要家庭增长访问限制。这通常使用 servlet 过滤器来完成。
假设您在@RequestScoped
bean 中按如下方式登录,
public String login() {
User user = userService.find(username, password);
FacesContext context = FacesContext.getCurrentInstance();
if (user != null) {
context.getExternalContext().getSessionMap().put("user", user);
return "dashboard.xhtml?faces-redirect=true";
} else {
context.addMessage(null, new FacesMessage("Unknown login, try again."));
return null;
}
}
然后,您可以在@WebFilter("/*")
筛选器中检查登录用户,如下所示:
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = request.getSession(false);
User user = (session != null) ? session.getAttribute("user") : null;
String loginURL = request.getContextPath() + "/login.xhtml";
boolean loginRequest = request.getRequestURI().startsWith(loginURL);
boolean resourceRequest = request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER);
if (user != null || loginRequest || resourceRequest)) {
chain.doFilter(request, response);
} else {
response.sendRedirect(loginURL);
}
}
因此请注意,当用户登录时,或者当直接请求登录页本身时,或者在请求JSF资源(CSS/JS/image)时,这将继续请求。
如果使用容器托管身份验证,则不需要筛选器。另请参阅如何处理数据库中用户的身份验证/授权?