package com.dji.sample.component; import com.dji.sample.common.error.CommonErrorEnum; import com.dji.sample.common.model.CustomClaim; import com.dji.sample.common.util.JwtUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpMethod; 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; import java.util.Optional; @Slf4j @Component public class AuthInterceptor implements HandlerInterceptor { public static final String PARAM_TOKEN = "x-auth-token"; public static final String TOKEN_CLAIM = "customClaim"; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String uri = request.getRequestURI(); log.debug("request uri: {}, IP: {}", uri, request.getRemoteAddr()); // The options method is passed directly. if (HttpMethod.OPTIONS.matches(request.getMethod())) { response.setStatus(HttpStatus.OK.value()); return false; } String token = request.getHeader(PARAM_TOKEN); // Check if the token exists. if (!StringUtils.hasText(token)) { response.setStatus(HttpStatus.UNAUTHORIZED.value()); log.error(CommonErrorEnum.NO_TOKEN.getMessage()); return false; } // Check if the current token is valid. Optional customClaimOpt = JwtUtil.parseToken(token); if (customClaimOpt.isEmpty()) { response.setStatus(HttpStatus.UNAUTHORIZED.value()); return false; } // Put the custom data from the token into the request. request.setAttribute(TOKEN_CLAIM, customClaimOpt.get()); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // Delete the custom data in the request after the request ends. request.removeAttribute(TOKEN_CLAIM); } }