java项目部署到服务器时出现乱码解决方案

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) {
                /*bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                char[] charBuffer = new char[128];*/
                int bytesRead = -1;
                byte[] bytes = new byte[1024*5];
                while((bytesRead = inputStream.read(bytes)) > 0){
                    stringBuilder.append(new String(bytes,0,bytesRead,"UTF-8"));
                }
                /*while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
                    stringBuilder.append(charBuffer, 0, bytesRead);
                }*/
            } 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
到此,乱码问题总算得到了解决,心情舒畅多了,这是我在项目中碰到的后端发生乱码的处理思路和方案,望采纳。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值