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

来源:互联网 发布:多益网络 社招 编辑:程序博客网 时间:2024/06/06 05:29

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初始化,一个是容器初始化.这并不是我们想要的.

@Componentpublic 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中优雅的使用配置文件的参数了.

阅读全文
0 0
原创粉丝点击