如何在Spring中的过滤器中排除特定的URL?

时间:2016-08-29 18:11:53

标签: java spring

我有一个基本的应用程序过滤器配置,如下所示:

@Configuration
public class ApplicationFilterConfig {

    /**
    * Check if user is logged in
    */
    @Bean
    public FilterRegistrationBean applicationFilterRegistration() {

        // created a collections that need logins to be validated.
        ArrayList<String> urlPatterns = new ArrayList<String>();
        urlPatterns.add("/home");
        urlPatterns.add("/about");
        urlPatterns.add("/contact");
        // ... 

        LoginFilter loginFilter = new LoginFilter();
        FilterRegistrationBean registration = new FilterRegistrationBean(); 
        registration.setFilter(loginFilter);
        registration.setUrlPatterns(urlPatterns);
        registration.setOrder(1);
        return registration;

    } 


}

但是,即使使用星标注释(例如urlPatterns),列表/employees/*也会变得很长。我之所以不使用/*的主要原因是因为我不想要求我的登录页面进行登录验证。如果我这样做,它会创建一个无限循环的重定向。

FilterRegistrationBean类是否允许您将过滤器应用于除某些模式之外的所有网址模式

我可以将除登录页面之外的所有内容放在目录中,并将我的URL模式设置为/subdirectory/*,但这会为我的webapp中的每个文件添加不必要的深度。

1 个答案:

答案 0 :(得分:0)

FilterRegistrationBean至今(到目前为止)没有提供任何排除 URL模式的方法。但是可以从Filter实现(在本例中为LoginFilter)中注意这一点。通过扩展LoginFilter来实现OncePerRequestFilter,该方法具有一种称为shouldNotFilter()的方法,可以根据需要对其进行覆盖。

    public class LoginFilter extends OncePerRequestFilter {

        private List<String> excludeUrlPatterns = new ArrayList<String();

        @Override
        protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
                FilterChain filterChain) throws ServletException, IOException
        {
            // Implementation....
        }

       @Override
       protected boolean shouldNotFilter(HttpServletRequest request) throws ServletException 
       {
           // Populate excludeUrlPatterns on which one to exclude here
       }

    }

有关更多详细信息,您可以遵循此link