Servlet之Filter過濾器
過濾器是一個實現了javax.servlet.Filter 接口的 Java 類。javax.servlet.Filter 接口定義了三個方法:
1 public void doFilter (ServletRequest, ServletResponse, FilterChain)
該方法在每次一個請求/響應對因客戶端在鏈的末端請求資源而通過鏈傳遞時由容器調用。
2 public void init(FilterConfig filterConfig)
該方法由 Web 容器調用,指示一個過濾器被放入服務。
3 public void destroy()
該方法由 Web 容器調用,指示一個過濾器被取出服務。
字符編碼過濾器
public class CharacterEncodingFilter implements Filter{ private String characterEncoding; private boolean enabled; public void init(FilterConfig config)throws ServletException{ characterEncoding = config.getInitParameter(“characterEncoding”); enabled = "true".equalsIgnoreCase(config.getInitParameter("enabled").trim()); } public void doFilter(ServletRequestrequest,ServletResponse response, FilterChainchain) throws IOException,ServletExceprion{ if(enabled&& characterEncoding !=null){ request.setCharacterEncoding(characterEncoding); response. setCharacterEncoding(characterEncoding); } chain.doFilter(request,response); //不能漏寫這一句 } public void destroy(){ characterEncoding = null; //銷毀時清空 } }
配置如下:
<filter> <filter-name> CharacterEncodingFilter </filter-name> <filter-class> filter.CharacterEncodingFilter</filter-class> <init-param> <param-name> characterEncoding </param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name> enabled </param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name> CharacterEncodingFilter </filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> </filter-mapping>
頁面編碼方式與Filter的編碼方式必須一致,另外,如果表單是GET方式提交的,還需要修改Tomcat的server.xml,指定URIEncoding(默認為ISO-8859-1)
<Connect port= "8080" protocol = ”HTTP/1.1” connectionTimeout = “20000”
redirectPort = “8443” URIEncoding = "UTF-8"/>
<dispatcher>標簽一般不用配置,默認為REQUEST,一共有四種
REQUEST:只有直接請求Servlet時才生效
FORWARD:只有當某Servlet通過forward到該Servlet時才生效
INCLUDE:JSP中通過<jsp:include/>請求某Servlet時才生效
ERROR:JSP通過<%@ pageerrorPage = “error.jsp” %>指定錯誤頁面時才生效
filter的順序是按照<filter-mapping>的配置先后來執行的
filter的典型應用還有身份驗證過濾器(Authentication Filters)、數據壓縮過濾器(Data compression Filters)、加密過濾器(EncryptionFilters)、觸發資源訪問事件過濾器、圖像轉換過濾器(Image Conversion Filters)、日志記錄和審核過濾器(Loggingand Auditing Filters)、MIME-TYPE 鏈過濾器(MIME-TYPE Chain Filters)、標記化過濾器(TokenizingFilters)、XSL/T 過濾器(XSL/T Filters)、轉換 XML 內容,此外,通過重載HttpServletRequestWrapper類,自定義request還可以實現文件上傳的Filter