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

时间:2011-07-30 13:33:32

标签: java jsf-2

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

2 个答案:

答案 0 :(得分:12)

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

假设您在某个网址格式上拥有所有受限制的网页,例如/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.
    }
}

将此过滤器映射到涵盖受限页面的网址模式。

此外,您需要确保已禁用这些页面上的浏览器缓存,否则最终用户仍可以在注销后从浏览器缓存中看到它们。您也可以使用过滤器。你甚至可以在同一个过滤器中完成它。另请参阅Browser back button doesn't clear old backing bean values

答案 1 :(得分:1)

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