- 使用TransmittableThreadLocal保存当前请求用户信息到方法中,方便获取当前用户信息
package com.zhey.common.base;
import com.alibaba.ttl.TransmittableThreadLocal;
import com.orchard.common.constants.CommonConstants;
import com.orchard.common.util.ValidUtil;
import java.math.BigInteger;
import java.util.HashMap;
import java.util.Map;
public class baseContextHandler {
static TransmittableThreadLocal
package com.orchard.common.constants;
public class CommonConstants {
public static final String JWT_TOKEN_HEADER = "Authorization";
public static final String JWT_SPM_HEADER = "Spm";
public static final String CONTEXT_KEY_USER_ID = "currentUserId";
public static final String CONTEXT_KEY_Account = "currentUserAccount";
public static final String CONTEXT_KEY_SESSION = "currentUserSession";
public static final String CONTEXT_KEY_USER_NAME = "currentUser";
public static final String CONTEXT_KEY_USER_TOKEN = "currentUserToken";
public static final String LOGIN_SOURCE = "loginSource";
}
- TransmittableThreadLocal赋值及销毁
package com.zhey.common.interceptor;
import com.orchard.common.annotation.IgnoreClientToken;
import com.orchard.common.base.baseContextHandler;
import com.orchard.common.constants.CommonConstants;
import com.orchard.common.entity.JWTInfo;
import com.orchard.common.exception.auth.ClientForbiddenException;
import com.orchard.common.jwt.JWTHelper;
import com.orchard.common.support.redis.RedisToken;
import com.orchard.common.util.ValidUtil;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import org.springframework.web.servlet.resource.ResourceHttpRequestHandler;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Slf4j
public class ServiceAuthRestInterceptor extends HandlerInterceptorAdapter {
@SuppressWarnings("unused")
private Logger logger = LoggerFactory.getLogger(ServiceAuthRestInterceptor.class);
@Autowired
private RedisToken redisToken;
private static final String HYSTRIX_WEB_PATH = "/hystrix";
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if(handler instanceof ResourceHttpRequestHandler) {
throw new ClientForbiddenException("Client is Forbidden!");
}
HandlerMethod handlerMethod = (HandlerMethod) handler;
String token = request.getHeader(CommonConstants.JWT_TOKEN_HEADER);
String spm = request.getHeader(CommonConstants.JWT_SPM_HEADER);
String session = request.getHeader(CommonConstants.BS_CRED);
SetAuthTokenInfo(token, spm,session);
return super.preHandle(request, response, handler);
}
private void SetAuthTokenInfo(String token, String spm, String session) throws Exception {
//从jwt获取用户信息
JWTInfo infoFromToken = JWTHelper.getInfoFromToken(token, spm.substring(0, 20));
baseContextHandler.set(CommonConstants.JWT_TOKEN_HEADER, token);
baseContextHandler.set(CommonConstants.JWT_SPM_HEADER, spm);
baseContextHandler.setUserAccount(infoFromToken.getAccount());
baseContextHandler.setName(infoFromToken.getUsername());
baseContextHandler.setUserID(infoFromToken.getUserId());
baseContextHandler.setLoginSource(infoFromToken.getTerminal());
if(!ValidUtil.isEmpty(session)) {
baseContextHandler.setUserSession(session);
}
}
//线程结束,销毁当前线程数据
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
baseContextHandler.remove();
super.afterCompletion(request, response, handler, ex);
}
}
package com.zhey.config;
import com.orchard.common.exception.GlobalExceptionHandler;
import com.orchard.common.interceptor.ServiceAuthRestInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebUserConfiguration implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(getServiceAuthRestInterceptor());
}
@Bean
ServiceAuthRestInterceptor getServiceAuthRestInterceptor() {
return new ServiceAuthRestInterceptor();
}
}