我有一个基本的应用程序过滤器配置,如下所示:
@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中的每个文件添加不必要的深度。
答案 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