概述
spring的拦截器是开发中最常用的,HandlerInterceptorAdapter中可以拦截请求,然后进行判断是否放行,也可以自己定义返回数据HttpServletResponse对象,然而我就是再设置返回数据的时候碰到了中文乱码的问题。
详细说明
1. 乱码情况
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 这里是token解析错误,可能是token过时导致,或者token错误
StatusResponse statusResponse = new StatusResponse();
statusResponse.setStatus(ResponseStatus.TOKEN_CHECK_ERROR);
statusResponse.setMessage("您的钥匙token已经过期或不合格");
statusResponse.setData(false);
PrintWriter writer = response.getWriter();
response.setStatus(ResponseStatus.OK);
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json");
writer.write(JSONObject.toJSONString(statusResponse));
writer.close();
return false;
}
执行之后的返回样子为:
{data: false, message: "????token????????", status: 10001}
明明已经设置了这个编码方式为 UTF-8 但是我从浏览器上看到的却是 content-type: application/json;charset=ISO-8859-1 ,于是进行了各种尝试,最后发现执行顺序更换一下就没有问题了,更换如下:
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 这里是token解析错误,可能是token过时导致,或者token错误
StatusResponse statusResponse = new StatusResponse();
statusResponse.setStatus(ResponseStatus.TOKEN_CHECK_ERROR);
statusResponse.setMessage("您的钥匙token已经过期或不合格");
statusResponse.setData(false);
response.setStatus(ResponseStatus.OK);
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json");
PrintWriter writer = response.getWriter();
writer.write(JSONObject.toJSONString(statusResponse));
writer.close();
return false;
}
如此这样便是执行正常了,我觉得因该是如果再设置编码凡是之前就获取到了PrintWriter对象,那么这个对象写出去的编码方式就已经固定了,所以后期response再进行设置编码方式已经没有用了,所以我们只要再获取PrintWriter对象之前就设置好response的编码方式,那么获取到的PrinterWriter的编码方式就UTF-8.
正常的输出如下:
{"data":false,"message":"您的钥匙token已经过期或不合格","status":10001}