拦截器动态获取用户信息

传统方法:获取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 获取Cookieticket的值

     *      2.2 redis中查找用户json数据

     *      2.2.1 如果查询的数据为null.则应该跳转到登陆页面

     *      2.2.2 如果查询到用户数据.则将json转化为User对象.

     *  3.未完待续

     *     

     */

@Override       //业务处理前执行(controller代码执行前)

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handlerthrows 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 userobjectMapper.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 exthrows Exception {

        System.out.println("用户信息删除");

        UserThreadLocal.remove();

    }

}

  1. 动态获取User数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值