自学内容网 自学内容网

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)!