1. 程式人生 > >html中form表單向Jsp提交中文亂碼問題基本解決辦法

html中form表單向Jsp提交中文亂碼問題基本解決辦法

一、表單提交的亂碼處理

  表單提交分為GET和POST兩種提交方式。兩種方式的亂碼解決又不一樣,用POST提交只需要在接受的時候加上request.setCharacterEncoding("utf-8");而GET方法處理應該將接收過來的值打碎成ISO-8859-1編碼的,然後再組裝成UTF-8的,new String(request.getParameter(param).getBytes("iso8859-1"),"UTF-8"),或者在from表單加上 accept-charset="UTF-8"。

二、過濾器處理亂碼問題

  如果每次接收都像上面那樣去處理的話肯定是太麻煩了,用過濾器來處理請求的亂碼問題很方便,只需要寫一個過濾器,就可以過濾所有請求頁面的亂碼問題了。至於如何用過濾器處理亂碼請看下文。不過值得注意的是,如果使用Struts的話,在web.xml裡面處理編碼的過濾器必須在struts過濾器前面註冊,否則所有頁面都不會經過過濾器。

首先寫一個過濾器的類,如下:

複製程式碼
 1 package com.util;
 2 
 3 import java.io.IOException;
 4 import java.io.UnsupportedEncodingException;
 5 
 6 import javax.servlet.Filter;
 7 import javax.servlet.FilterChain;
 8 import javax.servlet.FilterConfig;
 9 import javax.servlet.ServletException;
10 import javax.servlet.ServletRequest;
11 import javax.servlet.ServletResponse; 12 import javax.servlet.http.HttpServletRequest; 13 import javax.servlet.http.HttpServletRequestWrapper; 14 import javax.servlet.http.HttpServletResponse; 15 import javax.servlet.http.HttpSession; 16 17 18 //過濾器處理表單傳到servlet的亂碼問題 19 public class MyFilter implements
Filter{ 20 //自寫一個request換掉原來的request,重寫裡面的getParemeter方法,可以設定編碼 21 class MyRequest extends HttpServletRequestWrapper{ 22 23 @Override 24 public String getParameter(String param) { 25 String value = null; 26 try { 27 //post 28 super.setCharacterEncoding(encoding);//把編碼轉換為encoding 29 value = super.getParameter(param); 30 if(super.getMethod().equalsIgnoreCase("GET")){ 31 if(value!=null){ 32 value = new String(value.getBytes("iso8859-1"),encoding); 33 } 34 } 35 } catch (UnsupportedEncodingException e) { 36 // TODO Auto-generated catch block 37 e.printStackTrace(); 38 } 39 return value; 40 } 41 42 public MyRequest(HttpServletRequest request) { 43 super(request); 44 } 45 46 } 47 protected String encoding=null; 48 public void destroy() { //銷燬 49 // TODO Auto-generated method stub 50 this.encoding=null; 51 } 52 //對編碼問題進行轉換 53 public void doFilter(ServletRequest request, ServletResponse response, 54 FilterChain chain) throws IOException, ServletException { 55 // TODO Auto-generated method stub 56 response.setContentType("text/html;charset="+encoding); 57 //過濾未登入使用者 58 HttpServletRequest req = (HttpServletRequest) request; 59 HttpServletResponse resp = (HttpServletResponse) response; 60 String path=req.getServletPath(); 61 String param=req.getQueryString(); 62 if(path!=null){ 63 path=path+"?"+param;//全請求路徑 64 } 65 if(path.endsWith("myAddress")||path.endsWith("myJingDong")||path.indexOf("myShouCang")!=-1||path.endsWith("updateUser")||path.indexOf("showOrder")!=-1||path.indexOf("showValidOrder")!=-1||path.indexOf("showCancelOrder")!=-1||path.indexOf("fillOrder")!=-1){ 66 HttpSession session = req.getSession(); 67 String userName = (String) session.getAttribute("username"); 68 if(userName == null){ 69 session.setAttribute("url", path.replaceFirst("/", "")); 70 System.out.println(session.getAttribute("url")); 71 resp.sendRedirect("user.do?op=loginAction"); 72 return; 73 } 74 } 75 //把過濾器給下一個過濾器或資源處理器 76 chain.doFilter(new MyRequest((HttpServletRequest) request), response); 77 } 78 79 public void init(FilterConfig filterConfig) throws ServletException { 80 // TODO Auto-generated method stub 81 this.encoding=filterConfig.getInitParameter("encoding");//encoding在web.xml中指定 82 } 83 84 }
複製程式碼

然後在web.xml對該過濾器進行註冊和對映:

複製程式碼
<filter>
    <filter-name>EncodingFilter</filter-name>
    <filter-class>com.util.MyFilter</filter-class>
    <init-param>
       <param-name>encoding</param-name>
       <param-value>utf-8</param-value>
    </init-param>
  </filter>
 <filter-mapping>
     <filter-name>EncodingFilter</filter-name>
     <url-pattern>/*</url-pattern>
 </filter-mapping>
複製程式碼


上面寫的過濾器MyFilter類,本來只能處理post提交的資料(post是先處理後接收,get是先接收後處理)。

但是MyFilter裡面在對任何頁面過濾的時候,來了一個偷樑換柱:把原來客戶端請求的request給換掉了,換成自己定義的一個request了,即內部類MyRequest,不過該類要繼承一個類HttpServletRequestWrapper。

在自定義的一個內部類MyRequest裡面,實現了一個好強大的功能,就是重寫了request的getParameter()方法。該方法裡面即處理了post提交,又能處理get提交,返回的值就是處理後的值,所以該過濾器就能實現處理post和get提交的亂碼問題!

三.get方式 可以再server.xml的8080埠 節點中增加編碼

開啟你執行專案的tomcat 檔案目錄,找到 tomcat目錄下的\apache-tomcat\conf\server.xml 檔案,找到你的埠所在所在的xml配置 <Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" (新新增)URIEncoding="utf-8" /> 在其後面新增上 URIEncoding="utf-8",重啟tomcat,再次執行