乱码在日常开发写代码中是非常常见的,以前乱码使用的是通过设置一个过滤器解决,

现在可以使用SpringMVC给提供的过滤器,在web.xml设置,这比我们自己写的过滤器强大的的多.

注意:每次修改了xml文件都需要重启服务器(我的是Tomcat)

配置文件如下:

  1. <!-- 解决springmvc传递值乱码问题 -->
  2. <filter>
  3. <filter-name>encodingFilter</filter-name>
  4. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  5. <init-param>
  6. <param-name>encoding</param-name>
  7. <param-value>utf-8</param-value>
  8. </init-param>
  9. <init-param>
  10. <param-name>forceEncoding</param-name>
  11. <param-value>true</param-value>
  12. </init-param>
  13. </filter>
  14. <filter-mapping>
  15. <filter-name>encodingFilter</filter-name>
  16. <url-pattern>/*</url-pattern>
  17. </filter-mapping>

这个过滤器能处理绝大多数的乱码问题,如果不行可以考虑以下的解决方法

方法1:进入Tomcat的conf目录进入server.xml修改以下内容

  1. <Connector URIEncoding="utf-8" port="8080" protocol="HTTP/1.1"
  2. connectionTimeout="20000"
  3. redirectPort="8443" />

方法二:自定义滤器

  1. package com.kuang.filter;
  2. import javax.servlet.*;
  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.servlet.http.HttpServletRequestWrapper;
  5. import javax.servlet.http.HttpServletResponse;
  6. import java.io.IOException;
  7. import java.io.UnsupportedEncodingException;
  8. import java.util.Map;
  9. /**
  10. * 解决get和post请求 全部乱码的过滤器
  11. */
  12. public class GenericEncodingFilter implements Filter {
  13.    @Override
  14.    public void destroy() {
  15.   }
  16.  
  17.    @Override
  18.    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  19.        //处理response的字符编码
  20.        HttpServletResponse myResponse=(HttpServletResponse) response;
  21.        myResponse.setContentType("text/html;charset=UTF-8");
  22.        // 转型为与协议相关对象
  23.        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
  24.        // 对request包装增强
  25.        HttpServletRequest myrequest = new MyRequest(httpServletRequest);
  26.        chain.doFilter(myrequest, response);
  27.   }
  28.    @Override
  29.    public void init(FilterConfig filterConfig) throws ServletException {
  30.   }
  31. }
  32. //自定义request对象,HttpServletRequest的包装类
  33. class MyRequest extends HttpServletRequestWrapper {
  34.    private HttpServletRequest request;
  35.    //是否编码的标记
  36.    private boolean hasEncode;
  37.    //定义一个可以传入HttpServletRequest对象的构造函数,以便对其进行装饰
  38.    public MyRequest(HttpServletRequest request) {
  39.        super(request);// super必须写
  40.        this.request = request;
  41.   }
  42.    // 对需要增强方法 进行覆盖
  43.    @Override
  44.    public Map getParameterMap() {
  45.        // 先获得请求方式
  46.        String method = request.getMethod();
  47.        if (method.equalsIgnoreCase("post")) {
  48.            // post请求
  49.            try {
  50.                // 处理post乱码
  51.                request.setCharacterEncoding("utf-8");
  52.                return request.getParameterMap();
  53.           } catch (UnsupportedEncodingException e) {
  54.                e.printStackTrace();
  55.           }
  56.       } else if (method.equalsIgnoreCase("get")) {
  57.            // get请求
  58.            Map<String, String[]> parameterMap = request.getParameterMap();
  59.            if (!hasEncode) { // 确保get手动编码逻辑只运行一次
  60.                for (String parameterName : parameterMap.keySet()) {
  61.                    String[] values = parameterMap.get(parameterName);
  62.                    if (values != null) {
  63.                        for (int i = 0; i < values.length; i++) {
  64.                            try {
  65.                                // 处理get乱码
  66.                                values[i] = new String(values[i]
  67.                                       .getBytes("ISO-8859-1"), "utf-8");
  68.                           } catch (UnsupportedEncodingException e) {
  69.                                e.printStackTrace();
  70.                           }
  71.                       }
  72.                   }
  73.               }
  74.                hasEncode = true;
  75.           }
  76.            return parameterMap;
  77.       }
  78.        return super.getParameterMap();
  79.   }
  80.    //取一个值
  81.    @Override
  82.    public String getParameter(String name) {
  83.        Map<String, String[]> parameterMap = getParameterMap();
  84.        String[] values = parameterMap.get(name);
  85.        if (values == null) {
  86.            return null;
  87.       }
  88.        return values[0]; // 取回参数的第一个值
  89.   }
  90.    //取所有值
  91.    @Override
  92.    public String[] getParameterValues(String name) {
  93.        Map<String, String[]> parameterMap = getParameterMap();
  94.        String[] values = parameterMap.get(name);
  95.        return values;
  96.   }
  97. }

这是网上的大神写的过滤器,一般SpringMVC默认的乱码就能很好的解决了!

然后再web.xml配置这个过滤器即可

平时养成个好习惯,在能设置编码的地方,都统一使用utf-8!

处理SpringMVC中遇到的乱码问题的更多相关文章

  1. SPRINGMVC中的中文乱码处理

    说到乱码处理,对于很多人来说是非常经常遇到的,现在来总结一下web工程中中文乱码处理的几个步骤,乱码处理大致可以分为一下几步,分别从页面到数据库: 页面传值到后台: 工程编码(最后一开始建立工程就设置 ...

  2. springMvc 中返回字符串 乱码解决

    /** * produces=MediaType.APPLICATION_JSON_VALUE+";charset=utf-8" 乱码解决 * @param callback * ...

  3. SpringMVC中session使用&&拦截器&&乱码处理&&异常处理

    ### 1. 使用Session 通常,会在Session中存放: 1. 客户端(用户)的身份标识,通常是用户的id:2. 使用频率非常高的数据,例如显示在页面中的用户名.头像等:3. 其它的不便于使 ...

  4. SpringMVC中返回JSON时乱码的解决方案

    springMVC中返回JSON会出现乱码,解决如下: produces = "text/html;charset=UTF-8" @ResponseBody @RequestMap ...

  5. 解决springmvc+mybatis+mysql中文乱码问题【转】

    这篇文章主要介绍了解决java中springmvc+mybatis+mysql中文乱码问题的相关资料,需要的朋友可以参考下 近日使用ajax请求springmvc后台查询mysql数据库,页面显示中文 ...

  6. 解决springmvc中文件下载功能中使用javax.servlet.ServletOutputStream out = response.getOutputStream();后运行出异常但结果正确的问题

    问题描述: 在springmvc中实现文件下载功能一般都会使用javax.servlet.ServletOutputStream out = response.getOutputStream();封装 ...

  7. SpringMVC中的异步提交表单

    1.前言 近期在做一个项目,前台框架用的是EasyUI+SpringMVC,因为对SpringMVC不太了解,所以刚開始接触的时候有点吃力,在此通过一个EasyUi中的DataGrid表格来总结一下. ...

  8. JavaEE开发之SpringMVC中的路由配置及参数传递详解

    在之前我们使用Swift的Perfect框架来开发服务端程序时,聊到了Perfect中的路由配置.而在SpringMVC中的路由配置与其也是大同小异的.说到路由,其实就是将URL映射到Java的具体类 ...

  9. SpringMVC中参数绑定

    SpringMVC中请求参数的接收主要有两种方式, 一种是基于HttpServletRequest对象获取, 另外一种是通过Controller中的形参获取 一  通过HttpServletReque ...

随机推荐

  1. Day12_59_Java多线程

    多线程 1. 什么是进程? * 每个进程是一个应用程序,都有独立的内存空间,一个进程对应一个应用程序. * 例如:在windows操作系统中启动了word就是启动了一个进程,一边听音乐,一边打游戏就是 ...

  2. Kubernetes 降本增效标准指南 | 基于K8s 扩展机制构建云上成本控制系统

    作者 王玉君,腾讯云后台高级开发工程师,负责腾讯云原生系统开发及建设. 晏子怡,腾讯云容器产品经理,在K8s弹性伸缩.资源管理领域有丰富的实战经验. 导语 Kubernetes 作为 IaaS 和 P ...

  3. 光猫和路由器都支持ipv6,却无法使用ipv6?

    这些年很多地方的光猫都能获得ipv6地址了,而且新出的路由基本都支持ipv6,但是还是有很多人在http://test-ipv6.com看不到自己的ipv6地址,也上不了ipv6网站. 我也遇到这个问 ...

  4. Android APK程序的smali动态调试

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/71250622 一.Apktool的下载和安装 Apktool是Android逆向分 ...

  5. IDAPython类库---idautils.py的源码

    #--------------------------------------------------------------------- # IDAPython - Python plugin f ...

  6. markdown 实现代码折叠效果

    展开:我是一个挑山工,仙人跳 #include int main() { printf("挑山工,快乐加倍"); } 展开:我是一个挑山工,仙人跳 #include int mai ...

  7. <JVM上篇:内存与垃圾回收篇>01-JVM与Java体系结构

    笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...

  8. Java中读取文件的几种路径配置

    获取配置文件的两种方式区别 ClassLoader.getSystemClassLoader().getResourceAsStream() //ClassLoader.getSystemClassL ...

  9. 解决客户端Redis中文乱码问题

    启动客户端的时候添加 --raw 选项即可 wangyulong@code-local:~$ redis-cli 127.0.0.1:6379> set key1 '上海' OK 127.0.0 ...

  10. apache common pool2原理与实战

    完整源码,请帮我点个star哦! 原文地址为https://www.cnblogs.com/haixiang/p/14783955.html,转载请注明出处! 简介 对象池顾名思义就是存放对象的池,与 ...