package com.chuanghai.ihotel.interceptor; import com.chuanghai.ihotel.common.exception.BizCodeEnume; import com.chuanghai.ihotel.common.utils.CommonResult; import com.chuanghai.ihotel.util.CommonUtil; import com.chuanghai.ihotel.util.JWTUtil; import com.chuanghai.ihotel.vo.LoginUserVO; import com.fasterxml.jackson.databind.ObjectMapper; import io.jsonwebtoken.Claims; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.util.StringUtils; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.OutputStream; /** * 登录拦截 **/ @Slf4j public class LoginInterceptor implements HandlerInterceptor { public static ThreadLocal threadLocal = new ThreadLocal<>(); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (HttpMethod.OPTIONS.toString().equalsIgnoreCase(request.getMethod())) { response.setStatus(HttpStatus.NO_CONTENT.value()); return true; } // 获取token信息 String token = request.getHeader("user_token"); // 验证userToken if (!StringUtils.hasText(token)) { returnErrorResponse(response, BizCodeEnume.TOKEN_IS_EMPTY); return false; } // 解析token Claims claims = JWTUtil.checkJWT(token); if (claims == null) { // 未登录 returnErrorResponse(response, BizCodeEnume.TOKEN_INVALID); return false; } String cardNumber = (String) claims.get("card_number"); String identityType = (String) claims.get("identity_type"); LoginUserVO loginUserVO = LoginUserVO.builder().cardNumber(cardNumber).identityType(identityType).build(); threadLocal.set(loginUserVO); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { threadLocal.remove(); } // 返回错误信息 public void returnErrorResponse(HttpServletResponse response, BizCodeEnume bizCodeEnume) { try (OutputStream out = response.getOutputStream()) { CommonResult fail = CommonResult.fail(Integer.toString(bizCodeEnume.getCode()), bizCodeEnume.getMsg()); ObjectMapper objectMapper = new ObjectMapper(); response.setCharacterEncoding("utf-8"); response.setContentType("text/json"); out.write(objectMapper.writeValueAsString(fail).getBytes("utf-8")); out.flush(); } catch (IOException e) { e.printStackTrace(); } } }