zoukankan      html  css  js  c++  java
  • springboot~拦截器的使用场景

    在用户登陆之后,我们一般会把用户登陆的状态和相关信息进行存储,把对应的token返回到客户端进行存储,下次请求过来时,系统可以通过token拿到当前这个用户的相关信息,这是授权通常的作法,而有时一些业务里,你存储的用户信息不是全局的,可能只是某几个接口会用户某些信息,而你把它存储起来就不是很合理;并且一些隐私信息持久化到redis也不合理,这时就需要统一对这种接口的请求做一起处理了。

    拦截器HandlerInterceptor

    我们可以去实现这个HandlerInterceptor接口,它会把请求页面前,请求页面后等方法,我们可以重写它们,把自己的逻辑加进来,比如我们可以在请求页面前,通过当前登陆人ID获取到当前登陆人能看的信息ID集合,并把这些ID集合以参数的形式传到这个页面里,这个过程是在服务端自动完成的,即对某个页面(接口)进行拦截,添加自己的逻辑。

    /**
     * 当前用户的数据权限.
     */
    @Slf4j
    public class DataPermissionInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            logger.info("DataPermissionInterceptor.init");
            //业务逻辑,可能判断当前登陆人存储的数据权限类型,然后统一处理,拿到可以访问的数据编号集合
            String[] ids = {"1", "2", "3"};
            request.setAttribute("approveIds", StringUtils.join(ids, ","));
            return true;
        }
    }
    

    注册这个拦截器

    /**
     * 注册拦截器
     */
    @Configuration
    public class InterceptorConfig implements WebMvcConfigurer {
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            // 自定义拦截器,添加拦截路径和排除拦截路径
            registry.addInterceptor(new DataPermissionInterceptor()).addPathPatterns("/approve/**");
        }
    }
    

    在对应的页面(接口)里读取在拦截器里赋值的对象,就可以进行剩下的工作了。
    应用层代码
    通过这个例子我们了解到,对一些具有统一操作的动作,我们可以把它提取到拦截器里去完成。

  • 相关阅读:
    2016"百度之星"
    codeforces 55 div2 C.Title 模拟
    codeforces 98 div2 C.History 水题
    codeforces 97 div2 C.Replacement 水题
    codeforces 200 div2 C. Rational Resistance 思路题
    bzoj 2226 LCMSum 欧拉函数
    hdu 1163 九余数定理
    51nod 1225 余数的和 数学
    bzoj 2818 gcd 线性欧拉函数
    Codeforces Round #332 (Div. 2)D. Spongebob and Squares 数学
  • 原文地址:https://www.cnblogs.com/lori/p/12980378.html
Copyright © 2011-2022 走看看