拦截器的使用

导读:本篇文章讲解 拦截器的使用,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

一、先编写一个拦截器

这里加了JWT用于登录鉴权使用,可以按照自己的需求选择怎么写中间的业务


/**
 * 拦截器
 *
 * @author xusj
 * <br>CreateDate 2022/6/6 15:18
 */
@Slf4j
public class AuthInterceptor implements HandlerInterceptor {
    @Resource
    private RedisCache redisService;
    @Resource
    private HostHolder hostHolder;

	// 请求拦截要干嘛?
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        // 校验请求头
        log.info("请求拦截====>{}", request.getRequestURI());
        String accessToken = request.getHeader("Authorization");
        if (StringUtils.isEmpty(accessToken)) {
            throw new ServiceException(LoginEnum.AUTH_FAIL);
        }
        // 解析JWT,解析失败异常。获取请求头中的信息
        AccToken accToken = JwtTokenUtils.parseToken(accessToken);
        // 判断是否过期
        String accessTokenRedis = (String) redisService.getCacheObject(RedisConstants.USER_TOKEN_INFORMATION_AUTH + accToken.getUserId() + accToken.getUserAccount() + accToken.getSiteId());
        if (StringUtils.isEmpty(accessTokenRedis)) {
            throw new ServiceException(LoginEnum.LOGIN_EXPIRED);
        }
        // TODO XUSJ 放userId和siteId到请求头中,便于后面使用
        // 将token解码后的数据存入当前线程的ThreadLocalMap中
        hostHolder.setUser(accToken);
        log.info("=========当前threadLocal中的参数{}=========", JSON.toJSONString(accToken));
        return true;
    }
	// 请求结束后要干嘛
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 请求结束,将保存的信息清除
        hostHolder.clear();
    }
}

二、写拦截器的配置类,将拦截器注册到容器中

  • 1、注册到容器中
  • 2、选择拦截的url和需要泛型url
/**
 * 将拦截器注册到容器中
 *
 * @author xusj
 * <br>CreateDate 2022/8/17 16:34
 */
@Configuration
@Slf4j
public class WebUserConfig implements WebMvcConfigurer {

    @Bean
    public AuthInterceptor authInterceptor() {
        return new AuthInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册TestInterceptor拦截器
        InterceptorRegistration registration = registry.addInterceptor(authInterceptor());
        //所有路径都被拦截
        registration.addPathPatterns("/**");
        //添加不拦截路径
        registration.excludePathPatterns(
                "/**/*.html",
                //js静态资源
                "/**/*.js",
                //css静态资源
                "/**/*.css",
                "/**/*.woff",
                "/**/*.ttf",
                // swagger相关接口
                "/swagger-resources/**", "/webjars/**", "/v2/**", "/swagger-ui.html/**", "/error",
                "/", "/csrf",
                // 登录相关接口
                "/webUser/selectLoginWebSite",
                "/webUser/login",
                // c端相关接口全部放行
                "/client/**"
        );

    }

}

三、浅谈拦截器

1~4点截取自网络博文
1,拦截器的概念
java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action
执行前阻止其执行,同时也提供了一种可以提取Action中可重用部分代码的方式。在AOP中,拦截器用于在某个方法或者字段被访问之前,进行拦截
然后再之前或者之后加入某些操作。目前,我们需要掌握的主要是Spring的拦截器,Struts2的拦截器不用深究,知道即可。

2,拦截器的原理
大部分时候,拦截器方法都是通过代理的方式来调用的。Struts2的拦截器实现相对简单。当请求到达Struts2的ServletDispatcher时,Struts2
会查找配置文件,并根据配置实例化相对的拦截器对象,然后串成一个列表(List),最后一个一个的调用列表中的拦截器。Struts2的拦截器是可
插拔的,拦截器是AOP的一个实现。Struts2拦截器栈就是将拦截器按一定的顺序连接成一条链。在访问被拦截的方法或者字段时,Struts2拦截器链
中的拦截器就会按照之前定义的顺序进行调用。

3,自定义拦截器的步骤
第一步:自定义一个实现了Interceptor接口的类,或者继承抽象类AbstractInterceptor。
第二步:在配置文件中注册定义的拦截器。
第三步:在需要使用Action中引用上述定义的拦截器,为了方便也可以将拦截器定义为默认的拦截器,这样在不加特殊说明的情况下,所有的
Action都被这个拦截器拦截。

4、
在这里插入图片描述

5、详细操作和细节,转实战篇:后端的过滤器、拦截器、AOP的区别和使用

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/96201.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!