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)