1. 程式人生 > >java web中文編碼問題(ajax中編碼問題)

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放在首位,保證解碼之前設定了編碼格式