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

oly*_*ren 4 java jsf-2

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

Bal*_*usC 12

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

假设您在某个URL模式上有所有受限制的页面,例如/app/*,/secured/*并且您的会话范围bean具有托管bean名称user,那么您可以使用过滤器来完成该作业.在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.
    }
}
Run Code Online (Sandbox Code Playgroud)

将此过滤器映射到覆盖受限页面的URL模式.

此外,您需要确保已禁用这些页面上的浏览器缓存,否则最终用户仍可以在注销后从浏览器缓存中看到它们.您也可以使用过滤器.你甚至可以在同一个过滤器中完成它.另请参见浏览器后退按钮不会清除旧的支持bean值.