如何在SpringBoot的 过滤器之中注入Bean对象

我建立一个全局拦截器,此拦截器主要用于拦截APP用户登录和请求API时候,必须加密,我把它命名为SecurityFilter,它继承了Filter,web应用启动的顺序是:listener->filter->servlet

而因为项目应用了SpringBoot,所以我们项目启动时,先初始化listener,因此注解的bean会被初始化和注入;然后再来就filter的初始化,再接着才到我们的dispathServlet的初始化,因此,当我们需要在filter里注入一个注解的bean时,就会注入失败,因为filter初始化时,注解的bean还没初始化,没法注入。

那么,解决方法如下:

@Bean
public FilterRegistrationBean securityFilterRegistration() {
    	FilterRegistrationBean registration = new FilterRegistrationBean();		
	DelegatingFilterProxy httpBasicFilter = new DelegatingFilterProxy();
	registration.setFilter(httpBasicFilter);
	Map<String,String> m = new HashMap<String,String>();
	m.put("targetBeanName","securityFilter");
	m.put("targetFilterLifecycle","true");
	registration.setInitParameters(m);		   
	registration.addUrlPatterns("/appapi/*");

	registration.setOrder(2);
	return registration;
}
这样你就可以在securityFilter 里面添加@Autowired下的bean了。
@Autowired
private PermissionUserService userService;

以上事项方式会全局过滤,此过滤不起作用适合于全局过滤(/*);

registration.addUrlPatterns("/appapi/*");

建议使用如下方式

@Bean
public FilterRegistrationBean securityFilterRegistration() {
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        registrationBean.setFilter(securityFilterBean());
        registrationBean.addUrlPatterns("/appapi/*");
        registrationBean.setName("securityFilter");
        registrationBean.setOrder(2);
        return registrationBean;
    }
	
@Bean
public Filter securityFilterBean() {
 return new SecurityFilter();
}

参考文章:

https://blog.csdn.net/xiaoyi52/article/details/76686001

https://blog.csdn.net/cutterwolf/article/details/77849158

https://blog.csdn.net/u013076044/article/details/72903130

https://blog.csdn.net/angel708884645/article/details/51148865

如何在servlet取得spring beans (autowired)

https://blog.csdn.net/axzywan/article/details/8056892

非spring组件servlet、filter、interceptor中注入spring bean

https://www.cnblogs.com/duanxz/p/5463230.html


猜你喜欢

转载自blog.csdn.net/jianxia801/article/details/79807917
今日推荐