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 哪个版本,都需要设置相应的字符编码:
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);
<a name="JaxVg"></a>#### tomcat 响应乱码乱码原因:服务器发给浏览器的数据默认是按照ISO-8859-1编码,浏览器接收到数据后按照默认的字符集进行解码后显示,如果浏览器的默认解码字符集不是ISO-8859-1,就出现乱码<br />1、设置缓存区编码格式为UTF-8,使用 setCharacterEncoding() 方法```java//设置缓存区编码为UTF-8编码格式response.setCharacterEncoding("UTF-8");
2、在响应中主动告诉浏览器使用 UTF-8 编码格式接受数据,使用 setHeader() 方法
//在响应中主动告诉浏览器使用UTF-8编码格式来接收数据response.setHeader("Content-Type", "text/html;charset=UTF-8");
3、使用封装类进行简写Content-Type,使用 setContentType 方法则无需使用 setCharacterEncoding() 方法,推荐写法
//可以使用封装类简写Content-Type,使用该方法则无需使用setCharacterEncodingresponse.setContentType("text/html;charset=UTF-8");
编写 Filter 处理请求乱码
@WebFilter("/*")public class EncodingFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;// 处理POST请求乱码request.setCharacterEncoding("UTF-8");/* 处理响应乱码 */response.setContentType("text/html;charset=UTF-8");/* 处理GET请求乱码 */// 获取请求类型String method = request.getMethod();if ("GET".equalsIgnoreCase(method)) {// 获取服务器版本String serverInfo = request.getServletContext().getServerInfo();// 得到具体主版本号:Apache Tomcat/9.0.40String version = serverInfo.substring(serverInfo.indexOf("/") + 1, serverInfo.indexOf("."));System.out.println(version);// 判断服务器版本是否小于8if (Integer.parseInt(version) < 8) {// 得到自定义内部类,HttpServletRequest myWrapper = new MyWrapper(request);filterChain.doFilter(myWrapper, response);System.out.println("已执行");return;}}// 放行filterChain.doFilter(request, response);}@Overridepublic void destroy() {}static class MyWrapper extends HttpServletRequestWrapper {private HttpServletRequest request;public MyWrapper(HttpServletRequest request) {super(request);this.request = request;}@Overridepublic String getParameter(String name) {String value = request.getParameter(name);if (this.nonEmpty(value)) {System.out.println("被执行");// 将默认的ISO-8859-1编码字符转换成UTF-8value = new String(value.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);}return value;}@Overridepublic Map<String, String[]> getParameterMap() {Map<String, String[]> parameterMap = request.getParameterMap();for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {String[] value = entry.getValue();for (int i = 0; i < value.length; i++) {if (this.nonEmpty(value[i])) {// 取出每个value进行转换value[i] = new String(value[i].getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);}}}return parameterMap;}private boolean nonEmpty(String value) {return value != null && !"".equals(value.trim());}}}
