java開發過程當中從前臺傳到後臺中文亂碼《filter》

在企業開發中,最多見的是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請求。

經過以上的代碼即可以統一設置請求的編碼

有不對之處歡迎之處,謝謝!

相關文章
相關標籤/搜索