java项目部署到服务器时出现乱码解决方案
本人在写好项目后部署到服务器时,就开始出问题,给人心态都搞崩了;什么情况,自己本地测试时没有出现的问题,这刚放到服务器上就出问题了???(黑人问号脸)
本着我写的代码肯定有问题的原则,我开始检查自己的本地代码。
一、从最近的项目改动入手
想一想最近都对项目源码做了什么手脚;项目上线需要向相关部门提交日志信息,里面需要包含有请求的参数、返回的参数、请求方法、操作人等信息,于是就写了一个注解加aop类做接口动态拦截的功能。
于是就有了需要从request中获取请求的参数信息做日志上传的需求,正常request中的数据接口消费使用后就无法再从中获取到请求参数,于是在网上搜索了一个RequestWrapper类(该类相当于对request进行了复制,可以让我们使用两次)。
问题就出在了这里,本地测试时由于上传日志的ip外网无法访问到,就把这一步操作给注释掉了,这个RequestWrapper类不让他起作用。当部署到服务器上时肯定又要放开,这一下第一个问题就浮出了水面。
问题一:RequestWrapper对请求进行复制时,读取流的信息通过字符流读取且没有指明读取时的字符编码;在对数据进行设置时也没有指明相应的字符集。
这就很气人了,打断点也是请求的数据乱码;由于是在网上直接搬来的RequestWrapper类,自己也没改、没看,没得抱怨。
解决:将有关操作request对象的所有流信息转换为使用字节流读取并指定读取时为“utf-8”,处理后的代码奉上。
package com.zygh.jdjg.util;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.*;
public class RequestWrapper extends HttpServletRequestWrapper {
private final String body;
public RequestWrapper(HttpServletRequest request) {
super(request);
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = null;
InputStream inputStream = null;
try {
inputStream = request.getInputStream();
if (inputStream != null) {
int bytesRead = -1;
byte[] bytes = new byte[1024*5];
while((bytesRead = inputStream.read(bytes)) > 0){
stringBuilder.append(new String(bytes,0,bytesRead,"UTF-8"));
}
} else {
stringBuilder.append("");
}
} catch (IOException ex) {
} finally {
if (inputStream != null) {
try {
inputStream.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
if (bufferedReader != null) {
try {
bufferedReader.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
body = stringBuilder.toString();
}
@Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes("UTF-8"));
ServletInputStream servletInputStream = new ServletInputStream() {
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener readListener) {
}
@Override
public int read() throws IOException {
return byteArrayInputStream.read();
}
};
return servletInputStream;
}
@Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(this.getInputStream()));
}
public String getBody() {
return this.body;
}
}
找到了问题所在,可是开心坏了,就赶紧部署到服务器上进行测试;..........你没猜错,还是乱码。
问题二:服务器的数据库也不知道是谁创建的,并没有使用utf-8,而是使用我没使用过的latin。改吧。。。
.......然后不出意外还是有问题,这次一点侥幸都不抱了,肯定是自己的代码有问题,抓紧时间检查。
问题三:项目连接数据库时并没有指定交互的字符编码集
说实话,项目真不是我搭建的,本地测试时没有乱码我也不知道为啥,放到服务器时不指定字符集就会乱码。(很难受)
datasource:
url: jdbc:mysql://114.116.112.207:3306/drunk?useSSL=false&characterEncoding=utf-8
到此,乱码问题总算得到了解决,心情舒畅多了,这是我在项目中碰到的后端发生乱码的处理思路和方案,望采纳。