在企業開發中,最多見的是javaweb項目,有web項目就免不了和後臺打交道,好比我從jsp頁面發送新增請求到後臺,後臺多是servlet、struts二、springmvc等,這時就存在一個問題,在發送的參數值中若是包含中文常常到了後臺你發現會是亂碼,固然你能夠在後臺拿到值後對值進行從新編碼,可是若是每次都要進行從新編碼,會很麻煩,這裏介紹一中簡單的方式,但願能夠對你有用。java
filterweb
filter叫作過濾器,是java servlet中的技術,經過filter咱們能夠對要訪問的web服務器的資源進行過濾,以下圖,從網上找的spring
能夠看到要加了filter以後,要訪問web資源必須經過過濾器,若是沒有過濾器那麼咱們能夠直接訪問web資源,這就是過濾器的做用,便可以控制對資源的訪問;例如能夠監控用戶訪問的url,能夠禁止未登陸的用戶訪問,固然還有一個重點,那就是能夠過濾字符集。好了進入正題數據庫
Filter開發服務器
要開發filter有兩個步驟mvc
一、編寫java類實現javax.servlet.Filter接口app
二、註冊filterjsp
編寫filter實現類ide
1、filter接口有三個方法:init、destory、doFilterthis
init
在filter建立時候執行,filter的建立有web服務器負責,在啓動web服務器時會建立filter,這時便會執行filter的init方法,由於filter只會被建立一次,故init方法只會被調用一次,在此方法中能夠得到經過FilterConfig得到註冊時的初始化參數,提供了以下方法:
String getFilterName():獲得filter的名稱。
String getInitParameter(String name): 返回在部署描述中指定名稱的初始化參數的值。若是不存在返回null.
Enumeration getInitParameterNames():返回過濾器的全部初始化參數的名字的枚舉集合。
public ServletContext getServletContext():返回Servlet上下文對象的引用。
destory
web服務器調用destory方法銷燬filter,在filter的生命週期中此方法只執行一次,用戶釋放filter中使用的資源,如數據庫鏈接等。
doFilter
此方法是整個filter的關鍵,咱們要作的工做主要在此方法中完成,此方法提供三個參數:ServletRequest req, ServletResponse resp,
FilterChain chain ;chain參數是filter鏈,若是咱們想讓請求繼續往下執行必須調用chain.doFilter方法,這樣請求才會向下傳遞,咱們能夠根據本身的業務選擇在什麼時候調用chain.doFilter方法。
2、註冊filter
所謂註冊filter就是讓web服務器知道filter,讓filter起做用,須要再web.xml中進行註冊,具體的註冊的方式能夠參考下邊的例子。
字符過濾器
filter代碼以下:
1 package com.cn.imooc.filter; 2 3 import java.io.IOException; 4 5 import javax.servlet.Filter; 6 import javax.servlet.FilterChain; 7 import javax.servlet.FilterConfig; 8 import javax.servlet.ServletException; 9 import javax.servlet.ServletRequest; 10 import javax.servlet.ServletResponse; 11 import javax.servlet.http.HttpServletRequest; 12 import javax.servlet.http.HttpServletResponse; 13 14 public class SetCharacterEncodingFilter implements Filter { 15 16 //存儲編碼格式信息 17 private String encode = null; 18 @Override 19 public void destroy() { 20 // TODO Auto-generated method stub 21 22 } 23 24 @Override 25 public void doFilter(ServletRequest req, ServletResponse resp, 26 FilterChain chain) throws IOException, ServletException { 27 // TODO Auto-generated method stub 28 29 //轉換 30 HttpServletRequest request = (HttpServletRequest)req; 31 HttpServletResponse response = (HttpServletResponse)resp; 32 33 /* 34 * 判斷在web.xml文件中是否配置了編碼格式的信息 35 * 若是爲空,則設置編碼格式爲配置文件中的編碼格式 36 * 不然編碼格式設置爲utf-8
37 */ 38 if(this.encode != null && !this.encode.equals("")){ 39 request.setCharacterEncoding(this.encode); 40 response.setCharacterEncoding(this.encode); 41 }else{ 42 request.setCharacterEncoding("utf-8"); 43 response.setCharacterEncoding("utf-8"); 44 } 45 46 /* 47 * 使用doFilter方法調用鏈中的下一個過濾器或目標資源(servlet或JSP頁面)。 48 * chain.doFilter處理過濾器的其他部分(若是有的話),最終處理請求的servlet或JSP頁面。 49 */ 50 chain.doFilter(request, response); 51 52 } 53 54 @Override 55 public void init(FilterConfig arg0) throws ServletException { 56 // TODO Auto-generated method stub 57 58 this.encode=arg0.getInitParameter("encode"); 59 System.out.println("this.encode:"+encode); 60 } 61 62 }
在init方法中得到配置的初始化參數「encode」,把請求強轉爲httpSerevletRequest和HttpServletResponse,而後設置編碼,最後調用chain.doFilter(request,response)方法,這樣便實現了對編碼的過濾。
註冊filter以下,在web.xml中:
1 <!-- 過濾器配置信息 --> 2 <filter> 3 <filter-name>SetCharacterEncodingFilter</filter-name> 4 <!-- 過濾器設置編碼文件 --> 5 <filter-class>com.cn.imooc.filter.SetCharacterEncodingFilter</filter-class> 6 <init-param> 7 <!-- init-param元素定義了過濾器的初始化參數--> 8 <description>給參數和值設置名稱和編碼類型</description> 9 <param-name>encode</param-name> 10 <param-value>utf-8</param-value> 11 </init-param> 12 </filter> 13 <filter-mapping> 14 <!-- filter-mapping告訴容器全部與模式向匹配的請求都應該容許經過訪問控制過濾器。 15 全部以.action結尾的訪問都先經過過濾器文件過濾 --> 16 <filter-name>SetCharacterEncodingFilter</filter-name> 17 <url-pattern>*.action</url-pattern> 18 </filter-mapping>
在註冊filter的時候咱們配置了初始化參數,設爲了utf-8,在攔截的url中設置了,攔截全部的以action爲結尾的url請求。
經過以上的代碼即可以統一設置請求的編碼
有不對之處歡迎之處,謝謝!