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

nic*_*171 7 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;

    } 


}
Run Code Online (Sandbox Code Playgroud)

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

FilterRegistrationBean该类是否允许您对特定模式之外的所有URL模式应用过滤器?

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

Sum*_*try 10

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
       }

    }
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,您可以点击此链接