filter在spring架構中使用設定檔參數的一種方法,filterspring

來源:互聯網
上載者:User

filter在spring架構中使用設定檔參數的一種方法,filterspring
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中優雅的使用設定檔的參數了.

著作權聲明:歡迎轉載,但請註明出處 http://blog.csdn.net/itguangit/article/details/78349033

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.