filter在spring框架中使用配置文件参数的一种方法
在这里我是用 springboot 来开发,所以也用springboot来演示
对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中优雅的使用配置文件的参数了.