我有点不明白,urlPatterns
过滤器应该如何工作?为什么不管 url 是什么,过滤器都可以正常工作?
@WebFilter(urlPatterns = {"/groups/*"})
public class AuthorizationFilter implements Filter {
@Autowired
UserService service;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
filterChain.doFilter(request,servletResponse);
}
@Override
public void destroy() {
}
}
....
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
return new Filter[] { characterEncodingFilter,new AuthorizationFilter()};
}
....
@WebFilter
是一个非 Spring 注释,因此 Spring 会简单地忽略它。如果没有DispatcherServletInitializer
方法,getServletFilters
Web 应用程序甚至不会注意到过滤器。但它只getServletFilters()
返回一个过滤器数组,没有绑定到 URL。所以他们会为任何请求工作。有几种方法可以摆脱这种情况。首先,您可以将地址映射到 web.xml 中的过滤器:
其次,您可以使用原生的 Spring HandlerInterceptor。没错,他们不会简化代码。您将不得不不再在部署描述符中编写绑定,而是在上下文配置中编写绑定,这不会摆脱 xml 并且不会简化它,或者在代码中配置它们:
但是您可以通过在注释上发明自行车来稍微简化此选项:
剩下的就是在上下文配置中注册拦截器
而且它只适用于标有适当注释的方法。使用这辆自行车,部署描述符和上下文配置非常简单,根本不需要初始化程序。
但是,您甚至可以堆积自己的注释模拟
@WebFilter
!首先,我们需要另一辆自行车来检查模式:自己的 WebFilter 注释与俄罗斯方块和程序员:
和一个稍微修改的扰流板:
为了不弄脏带有端到端功能的代码,您可以创建一个方面来检查当前 URL 是否与模式匹配:
然后剧透简化为:
要从 Servlet 访问 Spring Beans,您可以创建一个包装器类,从中
request
继承调用方法。 ( https://stackoverflow.com/a/17490865/9967010 )HttpServletRequestWrapper
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this)