开发中遇到中文乱码,请检查“jsp-tomcat-struts1-ajax-webservice”,请检查以下几处:
1.jsp页面:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <%@ page language="java" pageEncoding="GBK" contentType="text/html;charset=GBK"%> <script type="text/javascript" src="${pageContext.request.contextPath }/tsjs/userinfo.js" charset="GBK"></script>
2.Action类:
request.setCharacterEncoding("GBK"); /**...**/ response.setContentType("text/html"); response.setCharacterEncoding("GBK"); PrintWriter out = response.getWriter(); out.write(price); out.flush(); out.close();
3.tomcat配置中(修改tomcat下的conf/server.xml文件),Tomcat(默认ISO-8859-1编码)****此处可不做修改:
<!--修改前<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />--> <!--修改后--> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />
4.最后就是自己写一个过滤器,这个是最有效的解决中文访问(request/response)的办法了:
字符编码过滤器类EncodingFilter:
package com.ts.filter; import java.io.IOException; import java.util.Map; import java.util.Set; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; /** * ClassName: EncodingFilter Chinese encoding exception <br/> * Date: 2015-1-15 下午01:37:20 <br/> * <br/> * * @author tskk@ts.com * * first made * @version 0.0.1<br/> * */ public class EncodingFilter implements Filter { private FilterConfig config; private String encoding; /** * filter Chinese encoding * */ @SuppressWarnings("unchecked") @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,ServletException { HttpServletRequest reqhttp = (HttpServletRequest) request; encoding = config.getInitParameter("encoding"); encoding = encoding == null ? "GBK" : encoding; //if ajax request if(reqhttp.getHeader("X-Requested-With") != null && reqhttp.getHeader("X-Requested-With").equalsIgnoreCase("XMLHttpRequest")){ request.setCharacterEncoding("UTF-8"); //webservice req res }else if(reqhttp.getHeader("soapaction") != null){ request.setCharacterEncoding("UTF-8"); //other req }else{ //post http req if(reqhttp.getMethod().equalsIgnoreCase("POST")){ request.setCharacterEncoding(encoding); } //get http req if(reqhttp.getMethod().equalsIgnoreCase("GET")){ Map map = reqhttp.getParameterMap(); Set set = map.entrySet(); for(Object obj : set){ //value entry.getKey() no encoding error Map.Entry entry = (Map.Entry)obj; String [] value = (String[]) entry.getValue(); for(int i = 0,j = value.length;i < j;i++){ String reqEncoding = reqhttp.getCharacterEncoding(); reqEncoding = reqEncoding == null ? "ISO8859-1" : reqEncoding; value[i] = new String(value[i].getBytes(reqEncoding),encoding); } } request = reqhttp; } } chain.doFilter(request,response); } /** * init encoding * @param config encoding * */ @Override public void init(FilterConfig config) throws ServletException { this.config = config; } /** * destroy encoding * */ @Override public void destroy() { this.config = null; } }
web.xml配置:
<!-- Chinese encoding --> <filter> <filter-name>EncodingFilter</filter-name> <filter-class>com.ts.filter.EncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>GBK</param-value> </init-param> </filter> <filter-mapping> <filter-name>EncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>