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中出现乱码问题的排查步骤以及方法,以便日后出现问题时回看.
版权声明:本文标题:SpringMVC:乱码问题的全面分析及解决方案 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1770559729a3535037.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论