web.xml中配置filter
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name></display-name> <filter> <filter-name>testFilter</filter-name> <filter-class>com.bolin.core.TestFilter.java</filter-class> <init-param> <param-name>specialUrl</param-name> <param-value> /login,/register </param-value> </init-param> </filter> <filter-mapping> <filter-name>testFilter</filter-name> <url-pattern>*.*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
假如有以下場景:
testFilet的初始化參數specialUrl在開發環境,測試環境和生產環境中有所區別,那么在系統提交測試,或者上線前必須要先修改web.xml,這樣的話就會比較繁瑣,給系統升級或測試增加額外開銷。
這樣就出現一個需求,希望能在系統啟動時讀取不同環境的配置信息來初始化web.xml,這個配置信息可以是庫中的數據,或者固定的配置文件,最好這些配置信息能夠一勞永逸,兼容開發環境,測試環境,生產環境,那以后就省事了。有一個開關去控制是什么環境,那就讀取相應環境的配置數據。
編碼實現web.xml配置filter
那在這樣的需求下,web.xml就需要以編碼的方式來實現配置。spring4.0以上的版本支持web.xml的編碼配置。實現AbstractAnnotationConfigDispatcherServletInitializer接口,在servlet3.0中web.xml啟動時會檢測該接口實現類,從能夠在實現類中去配置filter。
package com.bolin.core; import java.io.IOException; import java.util.EnumSet; import java.util.Iterator; import java.util.Properties; import javax.servlet.DispatcherType; import javax.servlet.Filter; import javax.servlet.FilterRegistration; import javax.servlet.FilterRegistration.Dynamic; import javax.servlet.ServletContext; import javax.servlet.ServletException; import org.apache.commons.lang.StringUtils; import org.springframework.core.io.ClassPathResource; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer{ @Override protected Class<?>[] getRootConfigClasses() { return null; } @Override protected Class<?>[] getServletConfigClasses() { return null; } @Override protected String[] getServletMappings() { return null; } @Override public void onStartup(ServletContext servletContext) throws ServletException { // 系統啟動時注冊filter FilterRegistration testFilter = servletContext.addFilter("testFilter", TestFilter.class); // 設置init param, param可以從properties文件中讀取或其他方式獲取,提供一個想法 testFilter.setInitParameter("specialUrl", "/login,/register"); testFilter.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class) , true, "*.*"); super.onStartup(servletContext); } @Override protected Dynamic registerServletFilter(ServletContext arg0, Filter filter) { return super.registerServletFilter(arg0, filter); } }
推薦一篇相同類型的博客:xml零配置之AbstractAnnotationConfigDispatcherServletInitializer
需要注意的是以上的實現,依賴servlet-api-3.0.jar和spring-webmvc-4.0以上版本jar包。