温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2022-02-24 17:39:14 来源:亿速云 阅读:225 作者:iii 栏目:开发技术

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

背景

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

表单

<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head>     <title>Title</title> </head> <body> <form action="/c02/t1" method="post">     <input type="text" name="name">     <input type="submit"> </form> </body> </html>

业务控制类

package controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller public 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中配置这个过滤器

    <filter>         <filter-name>EncodingFilter</filter-name>         <filter-class>Filter.EncodingFilter</filter-class>     </filter>     <filter-mapping>         <filter-name>EncodingFilter</filter-name>         <url-pattern>/*</url-pattern>     </filter-mapping>

使用SpringMVC提供的过滤器

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

<filter>    <filter-name>encoding</filter-name>    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>    <init-param>        <param-name>encoding</param-name>        <param-value>utf-8</param-value>    </init-param> </filter> <filter-mapping>    <filter-name>encoding</filter-name>    <url-pattern>/*</url-pattern> </filter-mapping>

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

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<String, String[]> 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<String, String[]> parameterMap = getParameterMap();         String[] values = parameterMap.get(name);         if (values == null) {             return null;         }         return values[0]; // 取回参数的第一个值     }     //取所有值     public String[] getParameterValues(String name) {         Map<String, String[]> parameterMap = getParameterMap();         String[] values = parameterMap.get(name);         return values;     } }

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

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI