鉴权拦截器
鉴权拦截器的作用是在处理请求之前对请求进行拦截,并进行鉴权操作。它可以用于验证用户的身份、权限或其他安全相关的操作。通过在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的请求:
结果: