1.定义工具类UserThreadLocal
public class UserThreadLocal {
private static ThreadLocal<User> userThread = new ThreadLocal<>();
public static void set(User user){
userThread.set(user);
}
public static User get(){
return userThread.get();
}
//防止内存泄漏
public static void remove(){
userThread.remove();
}
}
2.配置拦截器
//定义用户拦截器
public class UserInterceptor implements HandlerInterceptor{
@Autowired
private JedisCluster jedisCluster;
private ObjectMapper objectMapper = new ObjectMapper();
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
//1.获取Cookiez中的token
String token = null;
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
if("JT_TICKET".equals(cookie.getName())){
token = cookie.getValue();
break;
}
}
//2.判断token是否有数据
if(token != null){
//2.1判断redis集群中是否有数据
String userJSON = jedisCluster.get(token);
if(userJSON != null){
User user = objectMapper.readValue(userJSON,User.class);
//将user数据保存到ThreadLocal中
UserThreadLocal.set(user);
//证明用户已经登陆 予以放行
return true;
}
}
//配置重定向
response.sendRedirect("/user/login.html");
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
//关闭threadLocal
UserThreadLocal.remove();
}
}
3.使用案例
/*
* 1.实现订单确认页面的跳转
* url: /order/create.html
*/
@RequestMapping("/create")
public String create(Model model){
Long userId = UserThreadLocal.get().getId();
//根据userId查询购物车信息
List<Cart> cartList = cartService.findCartByUserId(userId);
UserThreadLocal.remove();
model.addAttribute("carts", cartList);
return "order-cart";
}
(仅demo案例)