我的問題對應的解決方案是:web.xml中filter的順序問題【置頂】。需要將編碼過濾器放置在所有過濾器之前。
在解決這個問題途中學習到的東西:
解決方案總結(post中文亂碼):
-
- 前后台編碼方式一致;
- 結合過濾器的使用;
- 表單傳輸方式的指定;
- Tomcat的server.xml;
1.前台:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<%
request.setCharacterEncoding("UTF-8");
%>
2.后台Struts.xml配置文件:
<constant name="struts.i18n.encoding" value="UTF-8"/>
3.web.xml中的過濾器(以下兩個都可以,擇一即可)
<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>
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"就可以了
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