应用场景
在Controller中获取用户信息
添加UserThreadLocal
package com.thy.common;
public class UserThreadLocal {
//把构造函数私有,外面不能new,只能通过下面两个方法操作
private UserThreadLocal(){
}
private static final ThreadLocal<MpUserInfo> LOCAL = new ThreadLocal<MpUserInfo>();
public static void set(MpUserInfo user){
LOCAL.set(user);;
}
public static MpUserInfo get(){
return LOCAL.get();
}
}
登录拦截器
在获取到用户信息后存入UserThreadLocal,在拦截器的afterCompletion方法中清空UserThreadLocal。
import java.io.PrintWriter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import com.alibaba.fastjson.JSON;
import com.thy.common.MpUserInfo;
import com.thy.common.ReturnData;
import com.thy.common.UserThreadLocal;
import com.thy.util.RedisUtils;
@Component
public class TokenInterceptor implements HandlerInterceptor{
//private static final Logger log = LoggerFactory.getLogger(TokenInterceptor.class);
@Autowired
private RedisUtils redisUtils;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
//log.info("---------------------开始进入请求地址拦截----------------------------");
//接收token
String token = request.getParameter("accessToken");
if (null == token) {
response.setCharacterEncoding("utf-8");
response.setContentType("application/json; charset=utf-8");
PrintWriter writer = response.getWriter();
ReturnData returnData = ReturnData.error("未授权的请求");
writer.write(JSON.toJSONString(returnData));
return false;
}
MpUserInfo t = (MpUserInfo) redisUtils.get(token);
if(t==null) {
response.setCharacterEncoding("utf-8");
response.setContentType("application/json; charset=utf-8");
PrintWriter writer = response.getWriter();
ReturnData returnData = ReturnData.error("accessToken已过期");
writer.write(JSON.toJSONString(returnData));
return false;
}
//将用户信息存入UserThreadLocal
UserThreadLocal.set(t);
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
//log.info("--------------处理请求完成后视图渲染之前的处理操作---------------");
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
//log.info("---------------视图渲染之后的操作-------------------------0");
//将UserThreadLocal中的用户信息清除
UserThreadLocal.set(null);
}
}
获取用户信息
在controller或service中调用
MpUserInfo mpUserInfo = UserThreadLocal.get();
网友评论