java web中文編碼問題(ajax中編碼問題)
再談java web中文編碼問題,這次稍微有些複雜,先說遇到的問題。
一、遇到的問題
1、用ajax中的load方法載入檔案
$("#customerTypeLevelRelList").load("<%=CONTEXT%>/jsp_lib/store/web/customerPrice.jsp", {customerRootId:customerRootId, storeId:<%=store.getStoreId()%>});
其中customerRootId為中文“洪海亮”,傳到customerPrice.jsp取到的卻是亂碼
String customerRootId = request.getParameter("customerRootId");
2、load方法普及
3、傳入的是資料物件,則傳送的是post請求,但是系統中用post請求傳送的中文引數沒有問題。
二、問題原因
看其呼叫棧,紅色標註的地方,多了一個SQLFilter,在web.xml中確實配置了並且只是針對.jsp才過濾,防止資料庫注入的
<filter-mapping>
<filter-name>SQL Filter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
customerPrice.jsp line: 18
customerPrice_jsp(HttpJspBase).service(HttpServletRequest,HttpServletResponse) line: 98
customerPrice_jsp(HttpServlet).service(ServletRequest,ServletResponse) line: 717
JspServletWrapper.service(HttpServletRequest,HttpServletResponse, boolean) line: 388
JspServlet.serviceJspFile(HttpServletRequest,HttpServletResponse, String, Throwable, boolean) line: 313
JspServlet.service(HttpServletRequest,HttpServletResponse) line: 260
JspServlet(HttpServlet).service(ServletRequest,ServletResponse) line: 717
ApplicationFilterChain.internalDoFilter(ServletRequest,ServletResponse) line: 290
ApplicationFilterChain.doFilter(ServletRequest,ServletResponse) line: 206
SiteMeshFilter(ContentBufferingFilter).bufferAndPostProcess(FilterChain,HttpServletRequest, HttpServletResponse, Selector) line: 169
SiteMeshFilter(ContentBufferingFilter).doFilter(ServletRequest,ServletResponse, FilterChain) line: 126
MyConfigurableSiteMeshFilter(ConfigurableSiteMeshFilter).doFilter(ServletRequest,ServletResponse, FilterChain) line: 163
MyConfigurableSiteMeshFilter.doFilter(ServletRequest,ServletResponse, FilterChain) line: 81
ApplicationFilterChain.internalDoFilter(ServletRequest,ServletResponse) line: 235
ApplicationFilterChain.doFilter(ServletRequest,ServletResponse) line: 206
OrgFilter.doFilter(ServletRequest, ServletResponse,FilterChain) line: 204
ApplicationFilterChain.internalDoFilter(ServletRequest,ServletResponse) line: 235
ApplicationFilterChain.doFilter(ServletRequest,ServletResponse) line: 206
SetCharacterEncodingFilter.doFilter(ServletRequest,ServletResponse, FilterChain) line: 142
ApplicationFilterChain.internalDoFilter(ServletRequest,ServletResponse) line: 235
ApplicationFilterChain.doFilter(ServletRequest,ServletResponse) line: 206
SQLFilter.doFilter(ServletRequest,ServletResponse, FilterChain) line: 52
ApplicationFilterChain.internalDoFilter(ServletRequest,ServletResponse) line: 235
ApplicationFilterChain.doFilter(ServletRequest,ServletResponse) line: 206
StandardWrapperValve.invoke(Request, Response) line: 233
StandardContextValve.invoke(Request, Response) line: 191
StandardHostValve.invoke(Request, Response) line: 127
ErrorReportValve.invoke(Request, Response) line: 103
StandardEngineValve.invoke(Request, Response) line: 109
CoyoteAdapter.service(Request, Response) line: 293
Http11AprProcessor.process(long) line: 879
Http11AprProtocol$Http11ConnectionHandler.process(long)line: 600
AprEndpoint$Worker.run() line: 1703
Thread.run() line: 745
其中用到了,這個時候還沒有設定setCharacterEncoding,因此採用預設編碼格式ISO-8859-1解碼,由於ajax中post請求預設是用UTF-8編碼的,所以出現了亂碼。
Iterator values = httpRequest.getParameterMap().values().iterator();// 獲取所有的表單引數
Iterator values2 = httpRequest.getParameterMap().values().iterator();// 獲取所有的表單引數
SetCharacterEncodingFilter中雖然再對編碼格式進行設定,這時候已經沒有用了(post表單提交的引數的解碼是在第一次呼叫request.getParameter也包括getParameterMap時發生的),也就是說已經按照ISO-8859-1解碼了,再設定編碼格式已經沒用了。
由於ajax中post請求預設是用UTF-8編碼的,這也就說明為什麼SetCharacterEncodingFilter中對ajax請求都設定了UTF-8編碼格式
三、解決方法
調整filter的順序,將SetCharacterEncodingFilter放在首位,保證解碼之前設定了編碼格式