filter在spring框架中使用配置文件参数的一种方法

时间:2021-10-12 11:23:31

filter在spring框架中使用配置文件参数的一种方法

在这里我是用 springboot 来开发,所以也用springboot来演示

对springboot 配置 filter不熟悉的可以看这篇文章

springboot自定义Filter的使用

那么配置好了 filter,该如何吧配置文件的参数读取出来显示呢?

有人第一会想到直接在Filter中 使用 @Value 注解注入再用参数接收不就行了,如:

     @Value("${weixin.appid}")
String appid;

但是,很遗憾,这样是注入不进来的,因为 我们的Filter 并不是一个bean,也就是说并没有纳入到spring容器中进行管理,也就无从谈起自动装配了,所以 @Value 是没办法让Spring帮我们注入进来的.

一个方法是在我们自定义的 MyFilter 中添加 @Component注解,这样在 它中的 @Value 也会起作用,但是 Filter会出现一些问题,被初始化两次,一个是Spring初始化,一个是容器初始化.这并不是我们想要的.

@Component
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("MyFliter.init()....");
}

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
StringBuffer requestURL = request.getRequestURL();
System.out.println("This is my fliter:"+requestURL);

filterChain.doFilter(servletRequest,servletResponse);

}

@Override
public void destroy() {
System.out.println("MyFilter.destory()....");

}
}

也有人想到那在 Filter中加载配置文件再去读取也可以啊,

可以是可以,性能不好,毕竟这是个全局过滤器,每次请求进来都加载一下配置文件,不够优雅.

一个优雅的解决方案是什么呢?

我们可以利用配置 filter 时,传递给它初始化参数:

因为这个配置类,我们采用java配置而不是xml文件配置,
所以这显然是一个bean,我们可以在这个配置文件中 使用 @Value() 进行配置文件属性注入

@Configuration//添加此注解,标识这是一个配置类
public class WebConfiguration {
@Value("${weixin.domain}")
private String domain;

@Bean
public RemoteIpFilter remoteIpFilter() {
return new RemoteIpFilter();
}

@Bean
public FilterRegistrationBean testFilterRegistrationBean() {

FilterRegistrationBean registrationBean = new FilterRegistrationBean();
registrationBean.setFilter(new MyFilter());
registrationBean.addUrlPatterns("/*");
registrationBean.addInitParameter("domain", "domain");
registrationBean.setName("MyFilter");
registrationBean.setOrder(1);


return registrationBean;
}


}

注意 registrationBean.addInitParameter(“paramName”, “value”);,这是用来初始化filter的参数的,这里添加后可以在Filter中取得,filterConfig.getInitParameter(“paramName”);

@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("CheckOpenidFilter init...");
domain = filterConfig.getInitParameter("domain");


}

,到此,我们就可以在Filter中优雅的使用配置文件的参数了.