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

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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值