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,使用该方法则无需使用setCharacterEncoding
response.setContentType("text/html;charset=UTF-8");
编写 Filter 处理请求乱码
@WebFilter("/*")
public class EncodingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public 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.40
String version = serverInfo.substring(serverInfo.indexOf("/") + 1, serverInfo.indexOf("."));
System.out.println(version);
// 判断服务器版本是否小于8
if (Integer.parseInt(version) < 8) {
// 得到自定义内部类,
HttpServletRequest myWrapper = new MyWrapper(request);
filterChain.doFilter(myWrapper, response);
System.out.println("已执行");
return;
}
}
// 放行
filterChain.doFilter(request, response);
}
@Override
public void destroy() {
}
static class MyWrapper extends HttpServletRequestWrapper {
private HttpServletRequest request;
public MyWrapper(HttpServletRequest request) {
super(request);
this.request = request;
}
@Override
public String getParameter(String name) {
String value = request.getParameter(name);
if (this.nonEmpty(value)) {
System.out.println("被执行");
// 将默认的ISO-8859-1编码字符转换成UTF-8
value = new String(value.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
}
return value;
}
@Override
public 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());
}
}
}