SpringBoot拦截器实战:登录验证与权限控制

版权申诉
0 下载量 71 浏览量 更新于2024-08-25 收藏 96KB PDF 举报
"SpringBoot拦截器的使用方法及其实现细节" 在SpringBoot应用中,拦截器(Interceptor)是一个非常重要的组件,它允许我们在处理请求之前或之后执行自定义的逻辑。SpringBoot拦截器主要用于增强应用程序的功能,比如进行权限验证、记录请求日志、性能监控等。在描述中提到,它特别适用于平台登录的验证。 具体实现SpringBoot拦截器的步骤如下: 1. 创建拦截器类:首先,我们需要创建一个自定义的拦截器类,并实现Spring的`HandlerInterceptor`接口。这个接口定义了三个方法:`preHandle()`, `postHandle()`, 和 `afterCompletion()`。 ```java @Slf4j @Component public class AuthInterceptor implements HandlerInterceptor { // ... } ``` 在这个例子中,`@Slf4j`是Lombok库的一个注解,用于自动注入日志对象;而`@Component`则将这个类注册为Spring Bean,使得Spring能够自动管理和使用这个拦截器。 2. 实现`preHandle()`方法:这是拦截器中最关键的方法,它在请求被处理器处理之前执行。在这里,我们可以进行权限检查、日志记录等操作。例如,检查请求头中的Token来验证用户是否已登录: ```java @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object object) { // ... } ``` 3. 处理逻辑:在`preHandle()`方法中,我们首先检查请求方法,对于预检请求(OPTIONS),可以直接返回`true`让请求继续。接着获取请求的IP地址并打印,然后从请求头中获取Token。如果Token为空,则表示未登录,返回`false`并设置响应状态为401(Unauthorized)。 ```java // 1. 请求方式为OPTIONS直接跳过 if (method.equals(HttpMethod.OPTIONS.toString())) { return true; } // 2. 获取IP并打印 String ip = IpUtils.getIpAddress(httpServletRequest); // 3. 获取Token String token = httpServletRequest.getHeader("token"); // 4. Token为空返回false if (StringUtils.isBlank(token)) { log.error("[拦截器] token为空, 请求失败ip=[{}]", ip); addMessageToResponse(httpServletResponse, HttpStatus.UNAUTHORIZED); return false; } // 5. 从Redis获取用户信息 // ... ``` 4. 从Redis获取用户信息:这里假设我们使用了Redis存储用户的登录信息,通过Token从Redis获取用户信息。如果找到用户信息,那么请求将继续处理,否则拒绝请求。 5. 其他方法:`postHandle()`方法在请求处理完成后但渲染视图之前执行,可以用来做一些清理工作或者收集统计信息。`afterCompletion()`方法在整个请求处理完成后,包括视图渲染完毕后执行,通常用于资源释放。 6. 配置拦截器:为了让Spring Boot应用知道并使用我们的拦截器,我们需要在Web配置类中注册它。通常,我们会扩展`WebMvcConfigurerAdapter`或使用`WebMvcConfigurer`接口,并重写`addInterceptors()`方法: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new AuthInterceptor()).addPathPatterns("/api/"); // 指定需要拦截的路径 } } ``` 通过这种方式,我们可以在Spring Boot应用中添加自定义的拦截逻辑,有效地控制和增强系统的功能。同时,还可以根据实际需求,调整拦截器的行为,如添加白名单路径、实现更复杂的权限验证等。