admin 管理员组

文章数量: 1184232

1.SpringMVC中的乱码问题

乱码问题是我们在开发时经常遇到的问题,我们遇见乱码可能会异常的头疼,因为那么多页面,到底是哪一个没有进行编码呢,今天记录并学习一下SpringMVC中的乱码问题

1.制造一个乱码
1.编写jsp页面

首先我们编写一个jsp页面,在jsp页面中添加一个form表单用于数据提交

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/c1/t1" method="post">
  <input type="text" name="name">
  <input type="submit">
</form>
</body>
</html>
2.搭建环境

web.xml

<?xml version="1.0" encoding="UTF-8"?><web-appxmlns=""xmlns:xsi=""xsi:schemaLocation=""version="4.0"><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc-servlet.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping></web-app>

springmvc-servlet.xml

<?xml version="1.0" encoding="UTF-8"?><beansxmlns=""xmlns:context=""xmlns:mvc=""xmlns:xsi=""xsi:schemaLocation=""><!--    自动扫描包,让指定包下的注解生效--><context:component-scanbase-package="com.sangyu.controller"/><mvc:default-servlet-handler/><mvc:annotation-driven/><!--    视图解析器--><beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"id="internalResourceViewResolver"><propertyname="prefix"value="/WEB-INF/jsp/"/><propertyname="suffix"value=".jsp"/></bean></beans>
3.编写controller

使用SpringMVC注解编写我们的controller

packagecom.sangyu.controller;importorg.springframework.stereotype.Controller;importorg.springframework.ui.Model;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.PostMapping;/**
 * @author sangYu
 * @date 2023/3/2
 */@ControllerpublicclassHelloController2{@PostMapping("/c1/t1")publicStringtest01(String name ,Model model){System.out.println(name);
        model.addAttribute("msg",name);return"hello01";}}

让我们来运行看看

1.提交一个字母

能够正常显示

2.提交一个汉字

出现乱码

2.解决方案

我们可以使用Spring为我们提供的编码过滤器,在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>

配置之后重启服务器,再次请求

能够正常显示

换一种请求方式,将请求方式更改为GET再试一次

能够正常显示

如果经过以上步骤,还是乱码应该怎么办呢!

3.极端情况排查
1.查看我们的Tomcat

找到我们的Tomcat目录,找到server.xml文件

2.将文件中的编码设置为utf-8

4.终极情况

如果以上配置都无法解决乱码问题,那只能使用我们的终极大招------大神的处理办法

使用大神的过滤器

packagecom.sangyu.filter;importjavax.servlet.*;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletRequestWrapper;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;importjava.io.UnsupportedEncodingException;importjava.util.Map;/**
* 解决get和post请求 全部乱码的过滤器
*/publicclassGenericEncodingFilterimplementsFilter{@Overridepublicvoiddestroy(){}@OverridepublicvoiddoFilter(ServletRequest request,ServletResponse response,FilterChain chain)throwsIOException,ServletException{//处理response的字符编码HttpServletResponse myResponse=(HttpServletResponse) response;
       myResponse.setContentType("text/html;charset=UTF-8");// 转型为与协议相关对象HttpServletRequest httpServletRequest =(HttpServletRequest) request;// 对request包装增强HttpServletRequest myrequest =newMyRequest(httpServletRequest);
       chain.doFilter(myrequest, response);}@Overridepublicvoidinit(FilterConfig filterConfig)throwsServletException{}}//自定义request对象,HttpServletRequest的包装类classMyRequestextendsHttpServletRequestWrapper{privateHttpServletRequest request;//是否编码的标记privateboolean hasEncode;//定义一个可以传入HttpServletRequest对象的构造函数,以便对其进行装饰publicMyRequest(HttpServletRequest request){super(request);// super必须写this.request = request;}// 对需要增强方法 进行覆盖@OverridepublicMapgetParameterMap(){// 先获得请求方式String method = request.getMethod();if(method.equalsIgnoreCase("post")){// post请求try{// 处理post乱码
               request.setCharacterEncoding("utf-8");return request.getParameterMap();}catch(UnsupportedEncodingException e){
               e.printStackTrace();}}elseif(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]=newString(values[i].getBytes("ISO-8859-1"),"utf-8");}catch(UnsupportedEncodingException e){
                               e.printStackTrace();}}}}
               hasEncode =true;}return parameterMap;}returnsuper.getParameterMap();}//取一个值@OverridepublicStringgetParameter(String name){Map<String,String[]> parameterMap =getParameterMap();String[] values = parameterMap.get(name);if(values ==null){returnnull;}return values[0];// 取回参数的第一个值}//取所有值@OverridepublicString[]getParameterValues(String name){Map<String,String[]> parameterMap =getParameterMap();String[] values = parameterMap.get(name);return values;}}

一般的编码问题,我们使用Spring的过滤器就能很好的解决了,本文只是自己学习一下在SpringMVC中出现乱码问题的排查步骤以及方法,以便日后出现问题时回看.

本文标签: 能够正常 问题 编程