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