问题
今天开发过程中,写了个拦截器,对于所以请求进行一个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 {@Autowiredprivate RedisTemplate redisTemplate;@Overridepublic 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");
输出结果