Spring添加自定义拦截器的方法
一、添加一个自定义拦截器并实现HandlerInterceptor方法
public class CartInterceptor implements HandlerInterceptor {
//ThreadLocal实质是个map,在同一个线程共享数据
public static ThreadLocal<UserInfoTO> threadLocal = new ThreadLocal<>();
/* *
* 在目标方法执行前要执行的操作
* 返回true放行,返回false拦截
* @author
* @create 2024/7/9
**/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
UserInfoTO userInfoTO = new UserInfoTO();
HttpSession session = request.getSession();
MemberRespVo member = (MemberRespVo) session.getAttribute(AuthServerConstant.LOGIN_USER);
if (member != null) {
userInfoTO.setUserId(member.getId());
}
Cookie[] cookies = request.getCookies();
if (cookies != null&&cookies.length>0) {
for (Cookie cookie : cookies) {
String cookieName = cookie.getName();
if(cookieName.equals(CartConstant.TEMP_USER_COOKIE_NAME)){
userInfoTO.setUserKey(cookie.getValue());
userInfoTO.setTempUser(true);
}
}
}
//如果临时用户为空则分配一个临时用户
if (userInfoTO.getUserKey() == null) {
String uuid = UUID.randomUUID().toString();
userInfoTO.setUserKey(uuid);
}
threadLocal.set(userInfoTO);
return true;
}
/* *
*
*业务方法执行以后要执行的操作,保存一个临时用户到浏览器
* @author
* @create 2024/7/9
**/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
UserInfoTO userInfoTO = threadLocal.get();
//如果不是临时用户,则指定cookie存储一个临时用户信息
if(!userInfoTO.isTempUser()){
Cookie cookie = new Cookie(CartConstant.TEMP_USER_COOKIE_NAME, userInfoTO.getUserKey());
//设置cookie的作用域
cookie.setDomain("gulimall.com");
//设置cookie的生命周期
cookie.setMaxAge(CartConstant.TEMP_USER_COOKIE_MAX_AGE);
response.addCookie(cookie);
}
}
}
上面的代码中实现了HandlerInterceptor两个方法:
1.preHandle:用于在业务操作执行前需要做的处理,返回结果boolean,如果是true则放行,false则会拦截;
2.postHandle:用于在业务操作执行后需要做的处理。
二、声明一个类并实现WebMvcConfigurer接口,在方法中将自定义的拦截器添加到注册器registry中,并指定拦截的方法,**则表示拦截所有方法
@Configuration
public class GulimallWebConfig implements WebMvcConfigurer {
public void addInterceptors(InterceptorRegistry registry) {
//添加一个拦截器,拦截所有的方法
registry.addInterceptor(new CartInterceptor()).addPathPatterns("/**");
}
}
如此便会在该应用controller方法执行前后执行拦截器定义的方法。
原文地址:https://blog.csdn.net/shenxiaomo1688/article/details/140299721
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!