拦截器动态获取用户信息

传统方法:获取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数据

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于你的问题,我可以给你一些思路和代码示例。 首先,拦截器可以通过实现`HandlerInterceptor`接口来定义。具体实现如下: ```java @Component public class UserInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 在请求处理之前进行拦截,可以在这里获取用户信息 User user = (User) request.getSession().getAttribute("user"); // 假设用户信息存在session中 if (user == null) { response.sendRedirect("/login"); // 如果用户未登录,则跳转到登录页面 return false; } return true; } // 其他方法省略 } ``` 以上代码中,我们通过实现`preHandle`方法,在请求处理之前进行拦截。在这个方法中,我们可以通过`HttpServletRequest`对象获取到当前请求的信息,比如请求头、请求参数、Session等信息。如果我们在登录时将用户信息存储在Session中,那么我们可以通过`request.getSession().getAttribute("user")`来获取当前登录用户的信息。 接下来,我们需要将拦截器注册到Spring Boot中。这可以通过在配置类中添加`@Bean`注解来完成。具体实现如下: ```java @Configuration public class InterceptorConfig implements WebMvcConfigurer { @Autowired private UserInterceptor userInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(userInterceptor).addPathPatterns("/**").excludePathPatterns("/login", "/register"); // 设置拦截的路径 } } ``` 以上代码中,我们通过实现`WebMvcConfigurer`接口,将拦截器注册到Spring Boot中。我们使用`addInterceptors`方法来添加拦截器,并通过`addPathPatterns`方法来指定需要拦截的路径。在这里,我们设置拦截所有路径,但是排除了登录和注册页面,因为这些页面不需要用户登录即可访问。 最后,需要注意的是,我们在拦截器获取用户信息时,需要确保用户已经登录。如果用户未登录,则需要将请求重定向到登录页面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值