SpringBoot拦截器的实现

时间:2021-06-28 18:01:24   收藏:0   阅读:0

介绍

在SpringBoot中,拦截器HandlerInterceptor 的功能跟过滤器类似,但是提供更精细的的控制能力:在request被响应之前、request被响应之后、视图渲染之前以及request全部结束之后。我们不能通过拦截器修改request内容,但是可以通过抛出异常(或者返回false)来暂停request的执行。

ThreadLocal这个类提供线程局部变量,在同一个线程,可以实现数据的共享。

实现一个自定义的拦截器主要步骤为如下几步:

第一步 创建自定义拦截器实现HandlerInterceptor 接口

package com.atbgpi.mall.product.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

//在执行目标之前 判断用户是否登录,并封装
public class CartInterceptor implements HandlerInterceptor {

    //创建一个静态的threadLocal
    public static ThreadLocal<Object> threadLocal = new ThreadLocal<>();

    //目标方法执行之前
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        HttpSession session = request.getSession();
        //TODO  通过session信息判断用户是否登录
        Cookie[] cookies = request.getCookies();
        if(cookies != null && cookies.length > 0){
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                //TODO 通过cookie信息标识临时用户
            }
        }
        //threadLocal中存数据,供业务下层使用
        threadLocal.set("这是一条该线程共享的数据");
        return true;
    }

    /**
     * 执行完毕之后分配临时用户让浏览器保存
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        //TODO  如果有需要浏览器保存的cookie信息
        Cookie cookie = new Cookie("key-name", "info");
        // 设置这个cookie作用域 过期时间
        cookie.setDomain("mall.com");
        cookie.setMaxAge(10);
        response.addCookie(cookie);
    }
}

第二步 重写 addInterceptors 方法

创建一个配置类,实现WebMvcConfigurer接口,重写 addInterceptors 方法,向其中注册上面自定义的拦截器。

@Configuration
public class MyWebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new CartInterceptor()).addPathPatterns("/**");
    }
}
评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!