package com.ard.sample.component; import com.ard.common.core.domain.model.LoginUser; import com.ard.common.enums.HttpMethod; import com.ard.framework.web.service.TokenService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; 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; @Slf4j @Component public class AuthInterceptor implements HandlerInterceptor { public static final String PARAM_TOKEN = "Authorization"; public static final String TOKEN_CLAIM = "loginUser"; @Autowired private TokenService tokenService; public AuthInterceptor(TokenService tokenService) { this.tokenService = tokenService; } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String uri = request.getRequestURI(); log.debug("request uri: {}", uri); // 预检请求直接放行 if (HttpMethod.OPTIONS.matches(request.getMethod())) { response.setStatus(HttpStatus.OK.value()); return false; } // 取 token(这里用 header,你也可以支持 query 参数) String token = request.getHeader(PARAM_TOKEN); if (!StringUtils.hasText(token)) { response.setStatus(HttpStatus.UNAUTHORIZED.value()); log.error("No token provided."); return false; } // 使用若依的 TokenService 解析用户 LoginUser loginUser = tokenService.getLoginUser(request); if (loginUser == null) { response.setStatus(HttpStatus.UNAUTHORIZED.value()); log.error("Invalid token."); return false; } // 校验 token 过期时间,快过期自动刷新 tokenService.verifyToken(loginUser); // 保存到 request,方便后面用 request.setAttribute(TOKEN_CLAIM, loginUser); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) { request.removeAttribute(TOKEN_CLAIM); } }