package com.common.Interceptor;
import com.common.utils.JwtUtils;
import io.jsonwebtoken.Claims;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
/**
* 自定義攔截器 ,作用不用再在每個方法前都去解析token了
* .在preHandle中,可以進行編碼、安全控制等處理;進入到api接口之前要做的事 必須要有布爾類型的返回值
* true 表示可以繼續執行
* false 攔截了表示 不能往下執行了
* 2.在postHandle中,有機會修改ModelAndView; 執行api方法之后要干的事
* 3.在afterCompletion中,可以根據ex是否為null判斷是否發生了異常,進行日志記錄。 所有的請求結束之后要做的事
*/
@Component
public class JwtInterceptor extends HandlerInterceptorAdapter {
@Autowired
private JwtUtils jwtUtils;
public JwtInterceptor() {
super();
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
/**
* 簡化獲取token 數據的代碼編寫
* 統一用戶的權限校驗 即是否登錄
* 也可以判斷當前用戶是否有當前訪問接口的權限
*/
//1.通過request 獲取token
String authorization = request.getHeader("Authorization");
//spring 判斷為空的方法
if(!StringUtils.isEmpty(authorization)&&authorization.startsWith("Bearer")){
//表示該用戶登錄
//獲取到token 信息
String token = authorization.replace("Bearer", "");
Claims claims = jwtUtils.parseJwt(token);
// claims.get("userName"); 獲取設置的用戶
//設置claims 到請求中 new Date(System.currentTimeMillis())
// Date issuedAt = claims.getIssuedAt();
//System.out.println("issuedAt "+issuedAt);
if(claims!=null) {
//設置claims 到request 域上
request.setAttribute("claims", claims);
return true;
}
}
//表示該用戶沒有登錄,輸出 出錯信息
PrintWriter out = null;
try{
response.setHeader("Content-type", "text/html;charset=UTF-8");
out = response.getWriter();
out.append("{\"success\":false,\"code\":SOS,\"msg\":\"您已經被藍金黃了,請重新登錄\"}");
}catch(IOException e){
e.printStackTrace();
}finally {
if (out != null) {
out.close();
}
}
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
super.afterCompletion(request, response, handler, ex);
}
}