问题
今天开发过程中,写了个拦截器,对于所以请求进行一个token的工作,对于不合标准的token返回错误,在网上找了个拦截器进行二次开发。
package com.maizhiyu.yzt.handle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
@Component
public class TokenInterceptor implements HandlerInterceptor {
@Autowired
private RedisTemplate redisTemplate;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception{
//Axios 发起跨域请求前,浏览器也会首先发起 OPTIONS 预检请求。检查服务器是否允许跨域访问。
System.out.println("拦截的请求路径:" + request.getRequestURI());
System.out.println("拦截的请求方法:" + request.getMethod());
if(request.getMethod().equals("OPTIONS")){
response.setStatus(HttpServletResponse.SC_OK);
System.out.println("允许跨域访问");
return true;
}
response.setCharacterEncoding("utf-8");
int index = request.getHeader("cookie").indexOf("token:");
String token = request.getHeader("cookie").substring(index);
if(token != null){
if(true){
Object o = redisTemplate.opsForValue().get("yztMsCusToken:login:token:" + token);
if(o==null){
System.out.println("token过期或者在用户退出的时候已删除,redis找不到");
return false;
}
System.out.println("通过拦截器");
return true;
}
}
response.setCharacterEncoding("UTF-8");
PrintWriter out = null;
response.getWriter().write("认证失败,错误码:50000");
return false;
}
}
但是发现这里返回的值是一个String。
但公司的要求是按照固定的Result的格式进行返回的,这就需要转一下了。一开的想法是把里面的直接String转变为Result.toString。
response.getWriter().write(Result.failure(401,"token非法").toString());
结果也是不合标准的。
解决方案
使用JSONObject
JSONObject jsonObject =new JSONObject();
jsonObject.put("code",401);
jsonObject.put("msg","失败");
response.getWriter().write(jsonObject.toString());
response.setContentType("application/json; charset=utf-8");
输出结果