tomcat 环境乱码

1、cmd 启动 tomcat 出现乱码:

  • 原因:日志输出编码【默认 UTF-8 】与 cmd【默认GBK】 编码不一致
  • 解决:
    • 方式一:调整 cmd 编码,使用命令【 chcp 65001 】
    • 方式二:调整日志输出编码,修改 tomcat 目录下的 conf/logging.properties 文件【ConsoleHandler.encoding=GBK】

2、idea 控制台下乱码:

  • 更改系统默认的 GBK 编码:添加 VM 参数【-Dfile.encoding=UTF-8】

请求乱码处理

1、对于 POST 请求,不管 tomcat 哪个版本,都需要设置相应的字符编码:

  1. request.setCharacterEncoding("UTF-8");

2、对于 GET 请求,分两种情况:

  • tomcat 8 及以上版本:不会乱码,不需要进行处理
  • tomcat 7 及以下版本:会乱码,需要进行处理 ```java // 处理方式一: new String(request.getParameter(“参数名”).getBytes(“ISO-8859-1”),”UTF-8”);

// 处理方式二:先编码再解码 ByteBuffer encode = StandardCharsets.ISO_8859_1.encode(request.getParameter(“参数名”)); CharBuffer decode = StandardCharsets.UTF_8.decode(encode);

  1. <a name="JaxVg"></a>
  2. #### tomcat 响应乱码
  3. 乱码原因:服务器发给浏览器的数据默认是按照ISO-8859-1编码,浏览器接收到数据后按照默认的字符集进行解码后显示,如果浏览器的默认解码字符集不是ISO-8859-1,就出现乱码<br />1、设置缓存区编码格式为UTF-8,使用 setCharacterEncoding() 方法
  4. ```java
  5. //设置缓存区编码为UTF-8编码格式
  6. response.setCharacterEncoding("UTF-8");

2、在响应中主动告诉浏览器使用 UTF-8 编码格式接受数据,使用 setHeader() 方法

  1. //在响应中主动告诉浏览器使用UTF-8编码格式来接收数据
  2. response.setHeader("Content-Type", "text/html;charset=UTF-8");

3、使用封装类进行简写Content-Type,使用 setContentType 方法则无需使用 setCharacterEncoding() 方法,推荐写法

  1. //可以使用封装类简写Content-Type,使用该方法则无需使用setCharacterEncoding
  2. response.setContentType("text/html;charset=UTF-8");

编写 Filter 处理请求乱码

  1. @WebFilter("/*")
  2. public class EncodingFilter implements Filter {
  3. @Override
  4. public void init(FilterConfig filterConfig) throws ServletException {
  5. }
  6. @Override
  7. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  8. HttpServletRequest request = (HttpServletRequest) servletRequest;
  9. HttpServletResponse response = (HttpServletResponse) servletResponse;
  10. // 处理POST请求乱码
  11. request.setCharacterEncoding("UTF-8");
  12. /* 处理响应乱码 */
  13. response.setContentType("text/html;charset=UTF-8");
  14. /* 处理GET请求乱码 */
  15. // 获取请求类型
  16. String method = request.getMethod();
  17. if ("GET".equalsIgnoreCase(method)) {
  18. // 获取服务器版本
  19. String serverInfo = request.getServletContext().getServerInfo();
  20. // 得到具体主版本号:Apache Tomcat/9.0.40
  21. String version = serverInfo.substring(serverInfo.indexOf("/") + 1, serverInfo.indexOf("."));
  22. System.out.println(version);
  23. // 判断服务器版本是否小于8
  24. if (Integer.parseInt(version) < 8) {
  25. // 得到自定义内部类,
  26. HttpServletRequest myWrapper = new MyWrapper(request);
  27. filterChain.doFilter(myWrapper, response);
  28. System.out.println("已执行");
  29. return;
  30. }
  31. }
  32. // 放行
  33. filterChain.doFilter(request, response);
  34. }
  35. @Override
  36. public void destroy() {
  37. }
  38. static class MyWrapper extends HttpServletRequestWrapper {
  39. private HttpServletRequest request;
  40. public MyWrapper(HttpServletRequest request) {
  41. super(request);
  42. this.request = request;
  43. }
  44. @Override
  45. public String getParameter(String name) {
  46. String value = request.getParameter(name);
  47. if (this.nonEmpty(value)) {
  48. System.out.println("被执行");
  49. // 将默认的ISO-8859-1编码字符转换成UTF-8
  50. value = new String(value.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
  51. }
  52. return value;
  53. }
  54. @Override
  55. public Map<String, String[]> getParameterMap() {
  56. Map<String, String[]> parameterMap = request.getParameterMap();
  57. for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
  58. String[] value = entry.getValue();
  59. for (int i = 0; i < value.length; i++) {
  60. if (this.nonEmpty(value[i])) {
  61. // 取出每个value进行转换
  62. value[i] = new String(value[i].getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
  63. }
  64. }
  65. }
  66. return parameterMap;
  67. }
  68. private boolean nonEmpty(String value) {
  69. return value != null && !"".equals(value.trim());
  70. }
  71. }
  72. }