package com.xiaopeng.common.security.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.xiaopeng.api.vo.account.LoginOperationUser; import com.xiaopeng.api.vo.account.LoginUser; import com.xiaopeng.common.core.utils.JwtUtils; import com.xiaopeng.common.core.utils.SpringUtils; import com.xiaopeng.common.security.service.TokenService; import io.jsonwebtoken.Claims; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.AsyncHandlerInterceptor; import com.xiaopeng.common.core.constant.SecurityConstants; import com.xiaopeng.common.core.context.SecurityContextHolder; import com.xiaopeng.common.core.utils.ServletUtils; import com.xiaopeng.common.core.utils.StringUtils; import com.xiaopeng.common.security.auth.AuthUtil; import com.xiaopeng.common.security.utils.SecurityUtils; /** * 自定义请求头拦截器,将Header数据封装到线程变量中方便获取 * 注意:此拦截器会同时验证当前用户有效期自动刷新有效期 * * @author ruoyi */ public class HeaderInterceptor implements AsyncHandlerInterceptor { private final TokenService tokenService = SpringUtils.getBean(TokenService.class); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (!(handler instanceof HandlerMethod)) { return true; } SecurityContextHolder.setUserId(ServletUtils.getHeader(request, SecurityConstants.DETAILS_USER_ID)); SecurityContextHolder.setUserName(ServletUtils.getHeader(request, SecurityConstants.DETAILS_USERNAME)); SecurityContextHolder.setUserKey(ServletUtils.getHeader(request, SecurityConstants.USER_KEY)); SecurityContextHolder.setOperationUserKey(ServletUtils.getHeader(request, SecurityConstants.OPERATION_USER_KEY)); String token = SecurityUtils.getToken(); if (StringUtils.isNotEmpty(token)) { String userType = JwtUtils.getUserType(token, tokenService.getSecret()); if ("system".equals(userType)) { LoginUser loginUser = AuthUtil.getLoginUser(token); if (StringUtils.isNotNull(loginUser)) { AuthUtil.verifyLoginUserExpire(loginUser); SecurityContextHolder.set(SecurityConstants.LOGIN_USER, loginUser); } } if ("operation".equals(userType)) { LoginOperationUser operationLoginUser = AuthUtil.getOperationLoginUser(token); if (StringUtils.isNotNull(operationLoginUser)) { AuthUtil.verifyOperationLoginUserExpire(operationLoginUser); SecurityContextHolder.set(SecurityConstants.LOGIN_OPERATION_USER, operationLoginUser); } } } return true; } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { SecurityContextHolder.remove(); } }