千家信息网

SpringMVC出现中文乱码的情况及怎么解决

发表于:2024-11-23 作者:千家信息网编辑
千家信息网最后更新 2024年11月23日,这篇文章主要介绍"SpringMVC出现中文乱码的情况及怎么解决"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"SpringMVC出现中文乱码的情况及怎么解决"
千家信息网最后更新 2024年11月23日SpringMVC出现中文乱码的情况及怎么解决

这篇文章主要介绍"SpringMVC出现中文乱码的情况及怎么解决"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"SpringMVC出现中文乱码的情况及怎么解决"文章能帮助大家解决问题。

背景

举个例子,出现中文乱码的例子:提交表单的时候。

表单

<%@ page contentType="text/html;charset=UTF-8" language="java" %>    Title

业务控制类

package controller;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;@Controllerpublic class controllerDemo02 {    @RequestMapping("/c02/t1")    public String test1(String name, Model model){        System.out.println(name);        model.addAttribute("message",name);        return "test";    }}

解决方案

使用自己写的过滤器

自定义一个Filter过滤器,去过滤乱码

package Filter;import javax.servlet.*;import java.io.IOException;public class EncodingFilter implements Filter {    public void init(FilterConfig filterConfig) throws ServletException {    }    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {        servletRequest.setCharacterEncoding("utf-8");        servletResponse.setCharacterEncoding("utf-8");        filterChain.doFilter(servletRequest,servletResponse);    }    public void destroy() {    }}

在web.xml中配置这个过滤器

            EncodingFilter        Filter.EncodingFilter                EncodingFilter        /*    

使用SpringMVC提供的过滤器

直接在web.xml中配置(固定的)

   encoding   org.springframework.web.filter.CharacterEncodingFilter          encoding       utf-8      encoding   /*

如果上面两种方法还实现不了,在试试以下这个方法,大神编写的

package Filter;import javax.servlet.*;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.UnsupportedEncodingException;import java.util.Map;public class GenericEncodingFilter implements Filter {    public void destroy() {    }    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {        //处理response的字符编码        HttpServletResponse myResponse=(HttpServletResponse) response;        myResponse.setContentType("text/html;charset=UTF-8");        // 转型为与协议相关对象        HttpServletRequest httpServletRequest = (HttpServletRequest) request;        // 对request包装增强        HttpServletRequest myrequest = new MyRequest(httpServletRequest);        chain.doFilter(myrequest, response);    }    public void init(FilterConfig filterConfig) throws ServletException {    }}//自定义request对象,HttpServletRequest的包装类class MyRequest extends HttpServletRequestWrapper {    private HttpServletRequest request;    //是否编码的标记    private boolean hasEncode;    //定义一个可以传入HttpServletRequest对象的构造函数,以便对其进行装饰    public MyRequest(HttpServletRequest request) {        super(request);// super必须写        this.request = request;    }    // 对需要增强方法 进行覆盖    public Map getParameterMap() {        // 先获得请求方式        String method = request.getMethod();        if (method.equalsIgnoreCase("post")) {            // post请求            try {                // 处理post乱码                request.setCharacterEncoding("utf-8");                return request.getParameterMap();            } catch (UnsupportedEncodingException e) {                e.printStackTrace();            }        } else if (method.equalsIgnoreCase("get")) {            // get请求            Map parameterMap = request.getParameterMap();            if (!hasEncode) { // 确保get手动编码逻辑只运行一次                for (String parameterName : parameterMap.keySet()) {                    String[] values = parameterMap.get(parameterName);                    if (values != null) {                        for (int i = 0; i < values.length; i++) {                            try {                                // 处理get乱码                                values[i] = new String(values[i]                                        .getBytes("ISO-8859-1"), "utf-8");                            } catch (UnsupportedEncodingException e) {                                e.printStackTrace();                            }                        }                    }                }                hasEncode = true;            }            return parameterMap;        }        return super.getParameterMap();    }    //取一个值    public String getParameter(String name) {        Map parameterMap = getParameterMap();        String[] values = parameterMap.get(name);        if (values == null) {            return null;        }        return values[0]; // 取回参数的第一个值    }    //取所有值    public String[] getParameterValues(String name) {        Map parameterMap = getParameterMap();        String[] values = parameterMap.get(name);        return values;    }}

关于"SpringMVC出现中文乱码的情况及怎么解决"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。

0