(1)使用ThreadLocal获取用户的信息
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)在拦截器中获取用户信息,并存入ThreadLocal中
//定义用户拦截器
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)在controller层中获取用户信息,并将信息移出ThreadLocal
/*
* 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";
}