在项目中,登录信息token解析以及请求头信息等一系列操作,可以通过HandlerInterceptor预处理。
/**
-
Created with IntelliJ IDEA.
-
Copyright@ Apache Open Source Organization
-
@Auther: wanghaigen
-
@Date: 2021/04/26/18:40
-
@Description:
*/
@Component
public class ParamInterceptor implements HandlerInterceptor {/**
- 请求开始 拦截对应的用户信息 存储到ThreadLocal
- @param request
- @param response
- @param handler
- @return
- @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 1、获取 用户登录信息 并处理
String userId = request.getHeader(Headers.AUTHORIZATION_USER_ID);
if (StringUtils.isNotBlank(userId)) {
UserUtils.setUserId(Long.parseLong(userId));
String tenantId = request.getHeader(Headers.PARENT_TENANT_ID);
if (StringUtils.isNotBlank(tenantId)) {
UserUtils.setTenantId(Long.parseLong(tenantId));
}
String parentTenantId = request.getHeader(Headers.TENANT_ID);
if (StringUtils.isNotBlank(parentTenantId)) {
UserUtils.setParentTenantId(Long.parseLong(parentTenantId));
}
UserUtils.setUsername(request.getHeader(Headers.USER_NAME));
UserUtils.setRealName(request.getHeader(Headers.USER_REALNAME));
}
return true;
}
/**
- 请求结束 清除 ThreadLocal 信息
- @param request
- @param response
- @param handler
- @param ex
- @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
UserUtils.remove();
}
}
实现拦截器代码:
备注:springboot2 WebMvcConfigurationSupport
@Configuration
public class InterceptorConfig extends WebMvcConfigurationSupport {
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new ParamInterceptor()).addPathPatterns("/**");
super.addInterceptors(registry);
}
}
UserUtils工具 通过ThreadLocal存储信息
代码如下:
public class UserUtils {
private static final ThreadLocal<UserResponse> TOKEN_THREAD_LOCAL = ThreadLocal.withInitial(() -> new UserResponse());
/**
* 获取 userId
*
* @return
*/
public static Long getUserId() {
return TOKEN_THREAD_LOCAL.get().getUserId();
}
/**
* 设置 userId
*
* @param userId
*/
public static void setUserId(Long userId) {
TOKEN_THREAD_LOCAL.get().setUserId(userId);
}
/**
* 获取商户id
*
* @return
*/
public static Long getTenantId() {
return TOKEN_THREAD_LOCAL.get().getTenantId();
}
/**
* 设置商户 id
*
* @param tenantId
*/
public static void setTenantId(Long tenantId) {
TOKEN_THREAD_LOCAL.get().setTenantId(tenantId);
}
/**
* 设置 appId
*
* @param appId
*/
public static void setAppID(Long appId) {
TOKEN_THREAD_LOCAL.get().setAppId(appId);
}
/**
* 获取 appId
*
* @return
*/
public static Long getAppId() {
return TOKEN_THREAD_LOCAL.get().getAppId();
}
public static String getUsername() {
return TOKEN_THREAD_LOCAL.get().getUsername();
}
public static void setUsername(String username) {
TOKEN_THREAD_LOCAL.get().setUsername(username);
}
public static String getRealName() {
return TOKEN_THREAD_LOCAL.get().getRealName();
}
public static void setRealName(String realName) {
TOKEN_THREAD_LOCAL.get().setRealName(realName);
}
/**
* 移除
*/
public static void remove() {
TOKEN_THREAD_LOCAL.remove();
}
public static String getUserIdAsStringValue () {
return getUserId() + "";
}
public static String getTenantIdAsStringValue () {
return getTenantId() + "";
}
/**
* 获取父商户id
*
* @return
*/
public static Long getParentTenantId() {
return TOKEN_THREAD_LOCAL.get().getParentTenantId();
}
/**
* 设置父商户 id
*
* @param parentTenantId
*/
public static void setParentTenantId(Long parentTenantId) {
TOKEN_THREAD_LOCAL.get().setParentTenantId(parentTenantId);
}
public static String getParentTenantIdAsStringValue () {
return getParentTenantId() + "";
}
}
@Data
@Accessors(chain = true)
public class UserResponse {
/**
* 用户 id
*/
private Long userId;
/**
* 用户名
*/
private String username;
/**
* 手机号
*/
private String realName;
/**
* 商户 id
*/
private Long tenantId;
/**
* 父商户 id
*/
private Long parentTenantId;
/**
* app id
*/
private Long appId;
}