1

我使用 JSF、Hibernate、Spring 创建了一个 Web 应用程序。我添加了一个过滤器来检查会话。我的过滤器代码是:

public class AdminFilter implements Filter{

     private ArrayList<String> urlList;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
       String urls = filterConfig.getInitParameter("avoid-urls");
       StringTokenizer token = new StringTokenizer(urls, ",");   
       urlList = new ArrayList<String>();

        while (token.hasMoreTokens()) {
            urlList.add(token.nextToken());  
        }
    }

    // Checking if user is logged in
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
                HttpServletRequest req= (HttpServletRequest) request;
        HttpServletResponse resp= (HttpServletResponse) response;
        String url = req.getServletPath();
        HttpSession session =   req.getSession();
                if(!urlList.contains(url) && session.getAttribute("user")==null) 
                {
                    resp.sendRedirect(req.getContextPath() + "/backend/login/index.xhtml");

                }
          chain.doFilter(req, resp);
    }

    @Override
    public void destroy() {
       // throw new UnsupportedOperationException("Not supported yet.");
    }

}

在过滤器的 init 方法中,我有一些避免 URL 的会话检查应该被跳过,比如登录页面本身。这工作正常,但此过滤器限制我的 CSS、图像和 JS 在登录页面上加载。建议我过滤器有什么问题?

4

2 回答 2

3

您的登录页面需要一些资源(CSS、JS、图像),这些资源是在单独的请求中从浏览器请求的,这些资源将被过滤器拦截,并且由于您没有任何参数可以跳过此类资源请求(在登录页面上使用)它将阻止此请求

建议:

您可以使用Spring-Security,而不是花时间编写您的,它通过配置获得了很大的灵活性

于 2012-06-11T02:39:42.660 回答
3

根据您当前的配置,当前您的过滤器将忽略 URL 是否用于获取 css、图像或任何其他资源。

boolean staticResources = (url.contains("css") || url.contains("images"));
if(!urlList.contains(url) && session.getAttribute("user")==null && !staticResources)  {
      resp.sendRedirect(req.getContextPath() + "/backend/login/index.xhtml");
}

这将避免会话检查静态内容。

更好的方法是使用声明式安全作为Java EE Web Security using realm 的一部分。

于 2012-06-11T02:39:51.653 回答