問題
今天開發過程中,寫了個攔截器,對于所以請求進行一個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");
輸出結果