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