在Jsf2中无需登录即可防止访问受限页面

我有个问题。 我想阻止用户在没有登录jsf2的情况下访问页面。 当用户直接将受限制的页面URL写入浏览器时,他/她不应该看到该页面。 就像上面的情况一样,他/她必须被重定向到登录页面。 我该如何以编程方式执行此操作?

这取决于您如何编程登录。 您似乎正在使用自行开发的身份validation,其中您将登录用户设置为会话范围的托管bean的属性。 因为Java EE提供了容器管理登录,所以已经考虑了阻止访问受限页面。

假设您在某个URL模式上有所有受限制的页面,例如/app/*/secured/*等,并且您的会话范围bean具有托管bean名称user ,那么您可以使用filter来完成该作业。 在doFilter()方法中实现以下内容:

 @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; HttpSession session = request.getSession(false); User user = (session != null) ? (User) session.getAttribute("user") : null; if (user == null || !user.isLoggedIn()) { response.sendRedirect("/login.xhtml"); // No logged-in user found, so redirect to login page. } else { chain.doFilter(req, res); // Logged-in user found, so just continue request. } } 

将此filter映射到覆盖受限页面的URL模式。

此外,您需要确保已禁用这些页面上的浏览器缓存,否则最终用户仍然可以在注销后从浏览器缓存中看到它们。 您也可以使用filter。 您甚至可以在同一个filter中执行此操作。 另请参阅浏览器后退按钮不会清除旧的后备bean值 。

您是否尝试过编写filter…您可以拦截所有呼叫,检查用户是否可以访问某个页面,如果没有,您可以将用户重定向到登录页面…