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);
|
}
|
}
|