JSF过滤器阻止直接访问某些页面

时间:2009-07-03 04:49:36

标签: jsf filter

我创建了一个过滤器,通过键入url来访问某个页面来阻止用户。我有3页,用户只能通过page1访问page2或page3。第一页要求用户输入用户名,登录第2页,依此类推。我有一个托管bean用户范围会话。这是我的过滤方法。问题是,当我从未输入用户名时,这一行(req.getAttribute(“user”)== null)不会给我null,但是像bean这样的bean.User@6ed322。任何人都可以帮我纠正哪里出错?

public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
    HttpServletRequest req = (HttpServletRequest) request;
    HttpServletResponse resp = (HttpServletResponse) response;
    HttpSession httpSession = req.getSession(false);
    String pageRequested = req.getRequestURI().toString();

    if (httpSession == null) {
        httpSession = req.getSession(true);
        resp.sendRedirect("Page1.faces");
    } else if (httpSession.getAttribute("user") != null
            && ((User) httpSession.getAttribute("user")).getUsername() == null
            && !pageRequested.contains("Page1.faces")) {
        resp.sendRedirect("Page1.faces");
    } else {
        chain.doFilter(request, response);
    }
}

4 个答案:

答案 0 :(得分:1)

所以,...当用户没有正确登录时,你想阻止访问某些页面吗?然后,您应该调查Spring安全性或JAAS以捕获页面访问权限并重定向到登录页面。您可以在会话中设置一个属性来进行良好的登录,并在过滤器中进行检查。

答案 1 :(得分:0)

在任何后续尝试之前关闭浏览器/清除会话/ cookie。您也可以制作一个使session.invalidate()的注销按钮 Spring安全性或JAAS对您来说可能是一个很大的开销,但您可以使用JSF PhaseListener而不是过滤器,例如对RENDER_RESPONSE阶段进行检查。

答案 2 :(得分:0)

  

我有一个托管bean用户范围的会话。

这是在faces-config.xml中声明的吗?这是在任何JSF页面中引用的吗?

如果是这样,那么JSF会自动创建一个。你不应该拦截它。从faces-config.xml删除声明或更改登录用户的检查方式。

如果没有,那么您的测试方法很差。要在客户端获取新会话,请重新启动客户端应用程序或在服务器端执行HttpSession#invalidate()(我认为这有点过于灾难性,只需删除或清空user属性会话应该足够了。)

答案 3 :(得分:0)

req.getRemoteUser()可以帮到你。它返回发出此请求的用户的登录信息。您必须阻止过滤其他资源,例如CSS添加此 pageRequested.contains(“。faces”),例如

else if (req.getRemoteUser() != null && (pageRequested.contains(".faces") && !pageRequested.contains("Page1.faces"))) {
            resp.sendError(403);