利用filter過濾器實現整個伺服器對中文的支援
過濾器filter和servlet伺服器小程式一樣,也是執行在伺服器端的java類filter負責對所有的請求在到達伺服器處理程式之前,先執行一些操作,達到對資料的預處理的目的。
比如我們可以編寫一個過濾器:
@WebFilter(filterName = "FilterOne")
public class FilterOne implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("begin filter");
chain.doFilter(req, resp);
System.out.println("end filter");
}
public void init(FilterConfig config) throws ServletException {
System.out.println("init param="+config.getInitParameter("param" ));
}
}
在web.xml中進行配置:
<filter>
<filter-name>filterone</filter-name>
<filter-class>com.myServlet.FilterOne</filter-class>
<init-param>
<param-name>param</param-name>
<param-value >chen</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>filterone</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
其中init-param是過濾器可以設定的一些初始化引數。
然後執行tomcat伺服器:
可以看到,初始引數在init()方法中被列印了出來。
然後隨便訪問這個伺服器上的一個網頁:
可以看到,過濾器程式被執行了。
有時候,我們需要對訪問的資料進行多次過濾,這時候可能就需要用到過濾器鏈了。過濾器鏈的執行順序與web.xml檔案中對filter的宣告順序一致。
再新建一個FilterTwo,參照FilterOne修改所有的輸出資訊。並在web.xml檔案中做以下宣告:
<filter>
<filter-name>filterone</filter-name>
<filter-class>com.myServlet.FilterOne</filter-class>
<init-param>
<param-name>param</param-name>
<param-value>chen</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>filterone</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>filtertwo</filter-name>
<filter-class>com.myServlet.FilterTwo</filter-class>
<init-param>
<param-name>param</param-name>
<param-value>chen</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>filtertwo</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
這樣,由於FilterOne宣告在前,FilterTwo宣告在後,所以當訪問到來時應該是先處理FilterOne在處理FilterTwo。
結果如下:
可以看到,這是一種類似棧的呼叫順序。入棧是訪問的到來,棧底是伺服器程式的處理,出棧是訪問的離開。
過濾器的一個應用例項,字元編碼的轉換:
比如之前我們寫過的那個servlet登入的小程式,如果我們的使用者名稱輸入中文,就會出現如下情況:
可以看到,中文的使用者名稱亂碼了,所以需要對它進行編碼的轉換,如果一個一個頁面地去轉換的話,顯然很費神而且容易出錯,這時候,過濾器就是一個很好的選擇了。
我們新建一個過濾器:
@WebFilter(filterName = "FilterOne")
public class FilterOne implements Filter {
String charEncoding;
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
if (!charEncoding.equals(req.getCharacterEncoding())){
req.setCharacterEncoding(charEncoding);
}
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
charEncoding=config.getInitParameter("encoding");
if (charEncoding==null){
System.out.println("沒有設定編碼方法");
}
}
}
也就是說,如果request的編碼方式和本伺服器的編碼方式不一致,那麼久將request的編碼方式轉換為本伺服器的編碼方式(寫死在web.xml中,見下)。
然後去下一個過濾器。
web.xml檔案如下:
filter>
<filter-name>filterone</filter-name>
<filter-class>com.myServlet.FilterOne</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>filterone</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
可以看到,現在支援中文了