鉴权拦截器(验证token)

鉴权拦截器

鉴权拦截器的作用是在处理请求之前对请求进行拦截,并进行鉴权操作。它可以用于验证用户的身份、权限或其他安全相关的操作。通过在preHandle()方法中编写鉴权逻辑,可以对请求进行验证,如果验证失败则可以拒绝请求或进行其他处理。鉴权拦截器可以提高系统的安全性,防止未经授权的访问。

拦截器拦截所有请求

如果将拦截器配置在全局拦截器链中,并且没有进行特定的路径匹配,那么该拦截器将会拦截所有的请求。拦截器会在请求处理之前进行拦截,并根据其逻辑决定是否继续执行后续的请求处理流程。如果拦截器返回true,则请求会继续向下执行;如果拦截器返回false,则请求会被中断,不再继续处理。所有,在全局拦截器中,如果不对请求进行路径匹配或其他条件判断,拦截器将会拦截所有的请求。

HandlerInterceptor接口

HandlerInterceptor接口是Spring MVC框架提供的一个拦截器接口。它定义了三个方法,分别是preHandle()、postHandle()和afterCompletion(),用于在请求处理的不同阶段进行拦截和处理。

  • preHandle()方法:在请求处理之前被调用,可以进行一些预处理操作。该方法返回一个布尔值,表示是否继续执行后续的请求处理流程。如果返回true,则继续执行后续的拦截器和处理器;如果返回false,则中断请求的处理流程。
  • postHandle()方法:在请求处理之后、视图渲染之前被调用。可以对请求的结果进行一些处理或修改。
  • afterCompletion()方法:在整个请求处理完成之后被调用,包括视图渲染完成。可以进行一些资源清理操作或记录日志等。
    通过实现HandlerInterceptor接口,可以自定义拦截器,并在Spring MVC的配置中注册拦截器。拦截器可以用于实现一些通用的功能,如日志记录、权限验证、跨域处理等。它可以在请求的不同阶段进行拦截和处理,对请求进行预处理、后处理或最终处理,提供了灵活的扩展和定制能力。

HandlerMethod

HandlerMethod是Spring MVC框架中的一个类,它表示一个处理请求的方法。HandlerMethod类封装了处理请求的方法的相关信息,包括所属的Controller对象、方法本身、方法参数等。它可以用于获取和操作处理请求的方法的相关信息,例如获取方法的名称、参数列表、注解等。在拦截器或其他处理器中,可以通过判断handler对象是否为HandlerMethod类型,来确定当前请求是由一个Controller类的方法处理的。

鉴权拦截器的实现

 /**
     * 鉴权拦截器
     */
    public class SystemInterceptor implements HandlerInterceptor {
        /**
         * 在处理请求之前进行拦截,进行鉴权操作
         * @param request HttpServletRequest对象,包含当前请求的信息
         * @param response HttpServletResponse对象,用于返回响应信息
         * @param handler 处理当前请求的处理器对象
         * @return 返回一个布尔值,表示是否允许请求继续执行
         * @throws Exception 如果鉴权失败或签名不存在,抛出异常
         */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            String path = request.getRequestURI();//获取当前请求的url地址
            System.out.println("path:" + path); // 打印请求路径
            if(handler instanceof HandlerMethod){
                // 判断请求处理器是否为 HandlerMethod 类型
                // 如果是,则获取请求头中名为 token 的值
                String token = request.getHeader("token"); // 获取请求头中的token
                System.out.println("token:" + token); // 打印token
                if(StringUtil.isEmpty(token)){ // 如果token为空
                    System.out.println("token为空");
                    throw new RuntimeException("签名不存在!"); // 抛出异常
                } else {
                    // 存在token,进行鉴权
                    Claims claims = JwtUtils.validateJWT(token).getClaims(); // 验证token的有效性,并获取其中的claims信息
                    if (claims != null) {
                        System.out.println("鉴权成功"); // 鉴权成功
                        return true;
                    } else {
                        System.out.println("鉴权失败");
                        throw new RuntimeException("鉴权失败"); // 抛出异常
                    }
                }
            } else {
                return true;
            }
        }

}

添加拦截器

@Configuration
public class WebAppConfigurer implements WebMvcConfigurer {
    //@Bean注解用于声明一个Bean,这里声明了一个名为systemInterceptor的Bean,并返回一个SystemInterceptor实例。
    // addInterceptors方法用于添加拦截器。在这里,我们将systemInterceptor添加为拦截器,并设置它作用于所有请求("/**"),
    // 但排除了一些特定的路径("/user/wxlogin"和"/image/**")。这意味着除了这些路径外,所有的请求都会经过systemInterceptor拦截器。
    @Bean
    public SystemInterceptor systemInterceptor(){
        return new SystemInterceptor();
    }
    // 添加拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        String []path=new String[]{"/user/wxlogin","/image/**"};
        registry.addInterceptor(systemInterceptor())
                .addPathPatterns("/**") // 作用于所有请求
                .excludePathPatterns(path); // 排除指定路径
        WebMvcConfigurer.super.addInterceptors(registry);
    }


    // 配置跨域请求
    // addCorsMappings方法用于配置跨域请求。
    // 这里使用registry对象来添加跨域映射,允许所有来源(allowedOrigins("*")),允许携带凭证(allowCredentials(true)),
    // 允许的请求方法包括GET、HEAD、POST、PUT、DELETE和OPTIONS(allowedMethods方法),并设置最大缓存时间为3600秒(maxAge(3600))。
    // 这段代码的作用是配置拦截器和跨域请求的规则,以便在Web应用程序中进行统一的请求处理和跨域访问控制。
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*") // 允许所有来源
                .allowCredentials(true) // 允许携带凭证
                .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE","OPTIONS") // 允许的请求方法
                .maxAge(3600); // 最大缓存时间
    }
}

效果演示

如果发送的请求中包含了token,则鉴权成功。
带token的请求:
在这里插入图片描述
结果:
在这里插入图片描述
在浏览器发送不带token的请求:
不带token的请求
结果:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值