传统方法:获取jt-ticket里的cookie信息,
cookie里获取ticket值
redis中获取userJson数据
将userJson转化为user对象,获取userld
springmvc配置文件添加拦截器配置:
<!--添加拦截器的配置
/*表示/cart下的一级目录
/** 表示/cart下的所有子级目录
-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/cart/**"/>
<bean id="webInterceptor" class="com.jt.web.interceptor.WebInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
拦截器核心:ThreadLocal
主要作用:实现本地线程内实现数据共享.并且是线程安全的
定义ThreadLocal工具类
/**
* 如果threadLocal中存储的数据不唯一,则使用Map数据结构进行获取.
*/
public class UserThreadLocal {
private static ThreadLocal<User> userThreadLocal
= new ThreadLocal<User>();
public static void set(User user){
userThreadLocal.set(user);
}
public static User get(){
return userThreadLocal.get();
}
public static void remove(){
//防止内存泄漏
userThreadLocal.remove();
}
}
拦截器功能实现
1.当用户没有登陆时,点击购物车按钮时应该跳转到登陆页面
2.当用户已经登陆后.点击购物车时,应该动态获取user信息
public class WebInterceptor implements HandlerInterceptor{
@Autowired
private JedisCluster jedisCluster;
private ObjectMapper objectMapper = new ObjectMapper();
/**
* 实现思路:
* 1.通过request对象获取Cookie信息
* 1.1 Cookie中有数据 则证明用户已经登陆成功
* 1.2 Cookie中没有数据.则证明用户没有登陆.则跳转到登陆页面
* 2.如果用户已经登陆
* 2.1 获取Cookie中ticket的值
* 2.2 从redis中查找用户json数据
* 2.2.1 如果查询的数据为null.则应该跳转到登陆页面
* 2.2.2 如果查询到用户数据.则将json转化为User对象.
* 3.未完待续
*
*/
@Override //业务处理前执行(controller代码执行前)
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String jt_ticket = null;
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
if("JT_TICKET".equals(cookie.getName())){
jt_ticket = cookie.getValue();
break;
}
}
//判断ticket是否 不为null;
if(!StringUtils.isEmpty(jt_ticket)){
//从缓存中获取userJSON数据
String userJSON = jedisCluster.get(jt_ticket);
if(!StringUtils.isEmpty(userJSON)){
//表示userJSON数据不为空
User user = objectMapper.readValue(userJSON, User.class);
/*如果将user信息存入域对象中,则每个Controller方法中,必须添加域对象的参数.这样的写法不是特别好,代码复杂,耦合性高
解决方案: 使用ThreadLocal实现user对象共享
本地线程变量作用:在当前线程内实现数据的共享.
*/
UserThreadLocal.set(user);
return true; //表示让程序放行
}
}
//如果程序执行到这里,表示用户数据为空,则跳转到 登陆页面
response.sendRedirect("/user/login.html");
//表示用户的请求是否放行.
//false 必须添加路径的转向,否则程序卡死
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 {
System.out.println("用户信息删除");
UserThreadLocal.remove();
}
}
- 动态获取User数据