背景
举个例子,出现中文乱码的例子:提交表单的时候。
表单
1 2 3 4 5 6 7 8 9 10 11 12 |
<%@ 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 > |
业务控制类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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过滤器,去过滤乱码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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中配置这个过滤器
1 2 3 4 5 6 7 8 |
< 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中配置(固定的)
1 2 3 4 5 6 7 8 9 10 11 12 |
< 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 > |
如果上面两种方法还实现不了,在试试以下这个方法,大神编写的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
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 中文乱码的解决方案的详细内容,更多关于SpringMVC 中文乱码的资料请关注其它相关文章!
原文链接:https://juejin.cn/post/6944667529717481485
查看更多关于SpringMVC 中文乱码的解决方案的详细内容...