相关文章:
SpringBoot 之AOP切面的使用
SpringBoot之Listener注册到Spring容器中的多种方法
SpringBoot之Interceptor拦截器注入使用
SpringBoot 之多个过滤器(Filter) ,监听器(Listener),切面(AOP),拦截器(Interceptor)的指定排序问题总结篇
使用Filter,Listener 时无法注入Bean的解决方法
实现Filter注册到spring容器中跟Listener差不多。
第一种:@WebFilter(urlPatterns="/**",filterName=“loginFilter”)
使用@WebFilter(urlPatterns="/**",filterName=“loginFilter”) 注解
在使用此注解前需要在启动类上加@ServletComponentScan(basePackages=“com.demo”)
使用此方式无法设置filter排序,要想实现排序,只能用类名排序或者使用第二种方式。
@Component // 不管哪种方式都需要添加@Component,表示加入spring 容器中。@WebFilter(urlPatterns="/**",filterName="loginFilter")public class LoginFilter implements Filter{@Overridepublic void init(FilterConfig filterConfig) throws ServletException {filterConfig.getInitParameter("name");//获取你设置的init参数// do somethinglog.debug("init...");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {// do something//chain.doFilter 需要调用,不然报错没有请求返回.chain.doFilter(request, response);}@Overridepublic void destroy() {// TODO Auto-generated method stub}}
@WebFilter()注解参数
第二种FilterRegistrationBean
推荐使用此种方式,可以设置排序,其他设置跟@WebFilter()差不多
@Component // 不管哪种方式都需要添加@Component,表示加入spring 容器中。public class LoginFilter implements Filter{@Overridepublic void init(FilterConfig filterConfig) throws ServletException {filterConfig.getInitParameter("name");//获取你设置的init参数// do somethinglog.debug("init...");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {// do something//chain.doFilter 需要调用,不然报错没有请求返回.chain.doFilter(request, response);}@Overridepublic void destroy() {// TODO Auto-generated method stub}}
@Configurationpublic class FilterConfig {@Beanpublic FilterRegistrationBean LoginFilter(){FilterRegistrationBean registrationBean = new FilterRegistrationBean();registrationBean.setFilter(new LoginFilter());registrationBean.addInitParameter("test","true");registrationBean.addInitParameter("test1", "test");registrationBean.addUrlPatterns("/*");registrationBean.setOrder(1); // 设置排序registrationBean.setDispatcherTypes(DispatcherType.REQUEST);return registrationBean;}}
第三种 @Bean
此方式跟FilterRegistrationBean 差不多,不过使用此方式无法配置拦截规则,不推荐使用
@Configuration public class FilterConfig {@Bean public Filter LoginFilter() {return new LoginFilter(); } }
使用Filter需要注意的问题
1、Filter只能通过类名排序,或者使用FilterRegistrationBean 设置order。@Order或者Ordered 接口都无法实现排序
2、使用@WebFilter 只能通过类名进行自定义Filter执行顺序。
3、使用@WebFilter 必须在启动器上加@ServletComponentScan(basePackages=“com.demo”),并且类必须在扫描的包中。
4、使用FIlter 或者Listener 无法使用@Autowired 或者@Resource注解。要想使用spring容器中的bean,则需要实现ApplicationContextAware接口的context注入函数, 将其存入静态变量. 通过ApplicationContext进行获取。或者通过WebApplicationContextUtils.getWebApplicationContext 方式获取。
具体获取方法请看:
5、Filter必须实现init方法,否则无法启动。