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

2022-09-04 20:51:09

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

@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/*/*

该类是否允许您将筛选器应用于除某些模式之外的所有 URL 模式?FilterRegistrationBean

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


答案 1

FilterRegistrationBean不提供(至少到目前为止)任何排除URL模式的方法。但是它可以从实现中得到照顾(在这种情况下是它的)。通过扩展来实现,它有一个名为()的方法,可以重写以满足您的需求。FilterLoginFilterLoginFilterOncePerRequestFiltershouldNotFilter

    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
       }

    }

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


答案 2

推荐