個人問題對應的解決方案是: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方式:
![](http://static.javashuo.com/static/loading.gif)
補充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