SSH中post提交表單action中文亂碼問題

個人問題對應的解決方案是:web.xml中filter的順序問題【置頂】。須要將編碼過濾器放置在全部過濾器以前。html

在解決這個問題途中學習到的東西:java

解決方案總結(post中文亂碼):web

    • 先後臺編碼方式一致;
    • 結合過濾器的使用;
    • 表單傳輸方式的指定;
    • Tomcat的server.xml;

1.前臺:spring

<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%>服務器

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">app

<%
    request.setCharacterEncoding("UTF-8");
%>ide

2.後臺Struts.xml配置文件:post

<constant name="struts.i18n.encoding" value="UTF-8"/>學習

3.web.xml中的過濾器(如下兩個均可以,擇一便可)ui

  <!-- spring的中文亂碼攔截器(必須置頂) -->
  <filter>
         <filter-name>EncodingFilter</filter-name>
         <filter-class>org.springframework.web.filter.CharacterEncodingFilter</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>
 
  <!-- 自定義的struts2的中文亂碼攔截器(置頂) -->
 <filter>
      <filter-name>CharEncodingFilter</filter-name>
      <filter-class>com.sram.filter.CharEncodingFilter</filter-class>
      <init-param>
          <param-name>encoding</param-name>
          <param-value>UTF-8</param-value>
      </init-param>
  </filter>
  <filter-mapping>
      <filter-name>CharEncodingFilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>
  
package com.sram.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class CharEncodingFilter implements Filter{
    String encoding;
    @Override
    public void destroy() {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp,
            FilterChain chain) throws IOException, ServletException {
        // TODO Auto-generated method stub
        req.setCharacterEncoding(encoding);
        chain.doFilter(req, resp);
    }

    @Override
    public void init(FilterConfig config) throws ServletException {
        // TODO Auto-generated method stub
        encoding  = config.getInitParameter("encoding");
        if(encoding==null||encoding.equals("")){
            encoding  = "UTF-8";
        }
    }
}

4.將form表單提交方式變爲post方式,即添加method="post"

5.Tomcat的server.xml沒有配置編碼,添加URIEncoding="UTF-8"就能夠了

 
<Connector port="6060" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" URIEncoding="UTF-8" 
useBodyEncodingForURI="true" 
/>

6.在action中重編碼,在指定參數的set方法中,將編碼設會「UTF-8",例如:須要修改每一個參數的set方法,比較麻煩(不推薦)

 public void setCopyRight(String copyRight){  

    try {  

this .copyRight = java.net.URLDecoder.decode (copyRight, "UTF-8" ); 

catch (UnsupportedEncodingException e) {  

              e.printStackTrace();  

}

}

補充post方式:

補充get方式:

若是提交方式爲get,設置request對象的編碼是無效的,想不亂碼,只能手工轉換。

1.  String data = "???????";//亂碼字符串
     byte source [] = data.getBytes("iso8859-1");//獲得客戶機提交的原始數據
     data = new String (data.getBytes("iso8859-1"),"UTF-8");//解決亂碼

     //等同於

    data = new String (source,"UTF-8");

2.get方式的亂碼,還能夠經過更改服務器配置的方式實現。更改Tomact的conf目錄下的server.xml文件。

      2.1    這種方式並不推薦,由於更改了服務器且並不靈活。

      2.2這麼設置後,request的setCharacterEncoding設置什麼編碼,鏈接器就用什麼編碼,雖然比上一種更改靈活,但依然會致使咱們的應用程序緊緊依賴於服務器,也不被推薦。

 

參考網址:http://www.cnblogs.com/yyz666/p/4051294.html

      http://www.cnblogs.com/wanggangblog/p/3477525.html

      http://www.cnblogs.com/chenssy/p/4220400.html

     Struts2攔截器解決亂碼問題http://blog.csdn.net/a9529lty/article/details/7069040

相關文章
相關標籤/搜索