我有一个基本的应用程序筛选器配置,如下所示:
@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)
有关更多详细信息,您可以点击此链接