在实际的项目中我们会遇见中文乱码的问题,这个问题是很恶心的事,所以我在这里提供了一些解决中文乱码的方法,希望能给大家一些帮助。
一、单独参数乱码
post请求:request.setCharacterEncoding("utf-8");
当客户端通过GET请求发送数据给服务器时,使用request.getParameter()获取的数据是被服务器误认为ISO-8859-1编码的,也就是说客户端发送过来的数据无论是UTF-8还是GBK,服务器都认为是ISO-8859-1,这就说明我们需要在使用request.getParameter()获取数据后,再转发成正确的编码。例如客户端以UTF-8发送的数据,使用如下转码方式:
get请求:String name = "获取参数内容"; name = new String(name.getBytes("iso-8859-1"),"utf-8");
二、整个项目乱码
那么对于整个项目怎么统一解决乱码问题呢?这里我们利用拦截器和装饰的方法解决这个问题
我们利用装饰者模式将HttpServletRequest中的getParameter方法进行重新封装,加入处理乱码问题的方法。
/** * 装饰reqeust * @author cxf * */ public class EncodingRequest extends HttpServletRequestWrapper { private HttpServletRequest req; public EncodingRequest(HttpServletRequest request) { super(request); this.req = request; } public String getParameter(String name) { String value = req.getParameter(name); // 处理编码问题 try { value = new String(value.getBytes("iso-8859-1"), "utf-8"); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } return value; }
public class EncodingFilter implements Filter { public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 处理post请求编码问题 request.setCharacterEncoding("utf-8"); HttpServletRequest req = (HttpServletRequest) request; /* * 处理GET请求的编码问题 */ // String username = request.getParameter("username"); // username = new String(username.getBytes("ISO-8859-1"), "UTF-8"); /* * 调包request * 1. 写一个request的装饰类 * 2. 在放行时,使用我们自己的request */ if(req.getMethod().equals("GET")) { EncodingRequest er = new EncodingRequest(req); chain.doFilter(er, response); } else if(req.getMethod().equals("POST")) { chain.doFilter(request, response); } } public void init(FilterConfig fConfig) throws ServletException { }
web.xml配置
<filter> <display-name>EncodingFilter</display-name> <filter-name>EncodingFilter</filter-name> <filter-class>cn.itcast.web.filter.EncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>EncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
这样post和get乱码的问题也就解决了。
三、简单方法
如果觉得上面的方式太繁琐,也可以通过修改 tomcat 的 server.xml 配置文件:
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
改成
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" useBodyEncodingForURI="true"/>
注: 如果是ajax发起的get请求中文依然会乱码,这时候需要把 useBodyEncodingForURI="true" 改为 URIEncoding="UTF-8" 。
推荐参考文章 :https://www.cnblogs.com/binye-typing/p/6281627.html
时间: 2024-11-05 13:40:57