0. 太长不看版 0.1 Servlet参考:https://blog.csdn.net/qq_53037676/article/details/125907391
-
Post请求中文乱码解决
- 方式1:
//也可以使用 request.setCharacterEncoding("utf-8"); String username = request.getParameter("username");- 方式2:
String username = request.getParameter("username"); username = new String(username.getBytes(StandardCharsets.ISO_8859_1),StandardCharsets.UTF_8); -
Get请求中文乱码解决
- 解决方式
String username = request.getParameter("username"); username = new String(username.getBytes(StandardCharsets.ISO_8859_1),StandardCharsets.UTF_8);
-
前端数据传后端乱码
- web.xml中配置字符集过滤器
1.3 注意事项encoding org.springframework.web.filter.CharacterEncodingFilter encoding utf-8 encoding @WebServlet("/demo") public class RequestDemo4 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1. 获取username String username = request.getParameter("username"); System.out.println("解决乱码前:"+username); //2. GET,获取参数的方式:getQueryString // 乱码原因:tomcat进行URL解码,默认的字符集ISO-8859-1 username = new String(username.getBytes(StandardCharsets.ISO_8859_1),StandardCharsets.UTF_8); System.out.println("解决乱码后:"+username); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } } - 把request.setCharacterEncoding("UTF-8")代码注释掉后,会发现GET请求参数乱码解决方案同时也可也把POST请求参数乱码的问题也解决了
- 只不过对于POST请求参数一般都会比较多,采用这种方式解决乱码起来比较麻烦,所以对于POST请求还是建议使用设置编码的方式进行
- Tomcat8.0之后,已将GET请求乱码问题解决,设置默认的解码方式为UTF-8 ==> 也就是说对于Servlet中文乱码问题,只需设置request.setCharacterEncoding("UTF-8")即可
项目结构:
-
新建一个maven项目,pom文件:
4.0.0 org.example ssmEncoding 1.0-SNAPSHOT 8 8 5.3.20 javax.servlet javax.servlet-api 4.0.1 provided javax.servlet.jsp jsp-api 2.2.1-b03 provided org.springframework spring-webmvc 5.3.20 org.springframework spring-tx 5.3.20 org.springframework spring-jdbc 5.3.20 org.springframework spring-context 5.3.20 -
添加web应用程序,web.xml代码:
springmvc org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:conf/dispatcherServlet.xml 1 springmvc / -
resources中新建conf文件夹,文件夹下新建dispatcherServlet.xml:
-
编写Controller类
package com.st.Controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @Controller public class Encoding { @RequestMapping(value = "/demo1", method = RequestMethod.POST) public String test(Model model, String name){ System.out.println(name); model.addAttribute("name",name); //获取表单提交的值 model.addAttribute("zw","中文测试"); //获取表单提交的值 return "test"; //跳转到test页面显示输入的值 } } -
index.jsp代码:
$Title$ test.jsp代码:
Title name=${name}; zw=${zw}; -
输入中文测试,发现乱码
向web.xml加入字符集过滤器:
encoding org.springframework.web.filter.CharacterEncodingFilter encoding utf-8 encoding /* springmvc org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:conf/dispatcherServlet.xml 1 springmvc / 加入过滤器后,乱码问题解决:
2.1.3 解决方式2:自定义过滤器 方法1可以解决大部分乱码问题,但有些极端情况下,这个过滤器对get的支持不好。
新建一个Filter:
package com.st.Filter; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.Map; public class GenericEncodingFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override 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); } @Override public void destroy() { } } //自定义request对象,HttpServletRequest的包装类 class MyRequest extends HttpServletRequestWrapper { private HttpServletRequest request; //是否编码的标记 private boolean hasEncode; //定义一个可以传入HttpServletRequest对象的构造函数,以便对其进行装饰 public MyRequest(HttpServletRequest request) { super(request);// super必须写 this.request = request; } // 对需要增强方法 进行覆盖 @Override 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请求 MapparameterMap = 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(); } //取一个值 @Override public String getParameter(String name) { Map parameterMap = getParameterMap(); String[] values = parameterMap.get(name); if (values == null) { return null; } return values[0]; // 取回参数的第一个值 } //取所有值 @Override public String[] getParameterValues(String name) { Map parameterMap = getParameterMap(); String[] values = parameterMap.get(name); return values; } } web.xml进行配置:
encoding com.st.Filter.GenericEncodingFilter encoding /* 中文结果测试
2.2 后端中文数据传入前端乱码 2.2.1 乱码问题@RequestMapping("/demo2") public String test1(String username){ String msg = ""; if(username != null){ System.out.println("check a1"); if(username.equals("admin")){ msg = "ok"; }else{ msg = "用户名有误"; } } return msg; }运行结果:
在SpringMVC中的Controller类中返回了一个中文字符串,在前端HTML页面显示"????"
2.2.2 解决方法在SpringMVC中可以通过注解@RequestMapping中的Produces属性指定返回返回值的字符编码。
@RequestMapping(value = "/demo2",produces = "text/html;charset=utf8") public String test1(String username){ String msg = ""; if(username != null){ System.out.println("check a1"); if(username.equals("admin")){ msg = "ok"; }else{ msg = "用户名有误"; } } return msg; }



