package com.common.utils;import javax.servlet.*;import java.io.IOException;public class SetCharacterEncodingFilter implements Filter { protected String encoding = null; //編碼方式 protected FilterConfig filterConfig = null; //參數設定物件 rotected boolean ignore = true; //是否採用改編碼 //讀取兩個參數的值 public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig; this.encoding = filterConfig.getInitParameter("encoding"); String value = filterConfig.getInitParameter("ignore"); if (value == null) this.ignore = true; else if (value.equalsIgnoreCase("true")) this.ignore = true; else if (value.equalsIgnoreCase("yes")) this.ignore = true; else this.ignore = false; } //過濾處理,如果ignore為true,則使用該指定的編碼 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 有條件地選擇設定字元編碼使用 if (ignore || (request.getCharacterEncoding() == null)) { String encoding = this.encoding; if (encoding != null) request.setCharacterEncoding(encoding); } chain.doFilter(request, response); } //銷毀時置空參數對象 public void destroy() { this.encoding = null; this.filterConfig = null; } } web.xml配置:<filter> <filter-name>SetCharacterEncodingFilter</filter-name> <filter-class>com.web0248.filter.SetCharacterEncodingFilter</filter-class> <init-param> <!-- 定義編碼格式,我用的是utf-8 --> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> <init-param> <!-- ignore參數是在過濾器類定義的 --> <param-name>ignore</param-name> <param-value>true</param-value> </init-param></filter><filter-mapping> <filter-name>SetCharacterEncodingFilter</filter-name> <servlet-name>action</servlet-name></filter-mapping><filter-mapping> <filter-name>SetCharacterEncodingFilter</filter-name> <servlet-name>*.jsp</servlet-name></filter-mapping>}
補充說明:在web.xml檔案中,所有filter元素必須出現在任意filter-mapping元素之前,filter-mapping元素又必須出現在所有servlet或servlet-mapping元素之前。
從前到後的順序為:...→filter→filter-mapping→listener→servlet→servlet-mapping→...