目录一、为什么要使用拦截器编辑二、拦截器的实现1.首先我们创建一个类 命名为 LoginInterceptor 这个类要实现 HandlerInterceptor 接口。2.然后我们想要在方法前和方法后都可以只要在你定义的 拦截器类里面实现好下面的三个方法中的其中一个或多个就可以。我要在其他接口调用的之前校验是否登录过。所以我实现的是preHandler 方法3.实现好 LoginInterceptor 类4.对拦截器进行使用配置类 AppConfig 需要实现 WebMvcConfigurer 接口5.实现WebMvcConfigurer接口里面的 addInterceptors 方法6.重写addInterceptors 的代码7.完成拦截器的添加拦截器实现拦截器配置一、为什么要使用拦截器在java项目中我们可以自动实现拦截器的实现我们可以选择开放或不开放某些接口这个时候我们就可以写一个拦截器让调用我们接口的时候先通过拦截器看看拦截器是否放行再去调用我们的接口和下图类似二、拦截器的实现1.首先我们创建一个类 命名为 LoginInterceptor 这个类要实现 HandlerInterceptor 接口。Slf4j Component public class LoginInterceptor implements HandlerInterceptor { }2.然后我们想要在方法前和方法后都可以只要在你定义的 拦截器类里面实现好下面的三个方法中的其中一个或多个就可以。我要在其他接口调用的之前校验是否登录过。所以我实现的是preHandler 方法public interface HandlerInterceptor { default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { return true; } default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, Nullable ModelAndView modelAndView) throws Exception { } default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Nullable Exception ex) throws Exception { } }3.实现好 LoginInterceptor 类Slf4j Component public class LoginInterceptor implements HandlerInterceptor { /** * 预处理业务请求之前调用 * param request current HTTP request * param response current HTTP response * param handler chosen handler to execute, for type and/or instance evaluation * return */ Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { // 获取请求头 String token request.getHeader(user_token); log.info(获取 token : {}, token); log.info(获取路径: {}, request.getRequestURL()); // 令牌解析 Claims claims JWTUtil.parseJWT(token); if(null claims) { log.error(解析JWT 令牌失败); response.setStatus(401); return false; } log.info(解析JWT令牌 成功 放行); return true; } }4.对拦截器进行使用配置类 AppConfig 需要实现 WebMvcConfigurer 接口Configuration public class AppConfig implements WebMvcConfigurer { }5.实现WebMvcConfigurer接口里面的 addInterceptors 方法6.重写addInterceptors 的代码把自己的拦截器给注入到该类里面然后要把不进入拦截器的网页资源给写出来。把你想要拦截的资源使用 InterceptorRegistry 类提供的 addInterceptor 方法添加进去。registry.addInterceptor(loginInterceptor)添加拦截器 .addPathPatterns(/**)添加拦截的资源路径 .excludePathPatterns(exclude)去除拦截的资源路径import com.example.lotterysystem.common.interceptor.LoginInterceptor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.format.FormatterRegistry; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.util.Arrays; import java.util.List; Configuration public class AppConfig implements WebMvcConfigurer { Autowired LoginInterceptor loginInterceptor; private final ListString exclude Arrays.asList( /**/*.html, /css/**, /js/**, /pic/**, /*.jpg, /*.png, /favicon.ico, /**/login, /register, /verification-code/send ); Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(loginInterceptor) .addPathPatterns(/**) .excludePathPatterns(exclude); } }7.完成拦截器的添加配置类和拦截器类给书写完毕就完成了拦截器的实现拦截器实现package com.example.lotterysystem.common.interceptor; import com.example.lotterysystem.common.utils.JWTUtil; import io.jsonwebtoken.Claims; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; Slf4j Component public class LoginInterceptor implements HandlerInterceptor { /** * 预处理业务请求之前调用 * param request current HTTP request * param response current HTTP response * param handler chosen handler to execute, for type and/or instance evaluation * return */ Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { // 获取请求头 String token request.getHeader(user_token); log.info(获取 token : {}, token); log.info(获取路径: {}, request.getRequestURL()); // 令牌解析 Claims claims JWTUtil.parseJWT(token); if(null claims) { log.error(解析JWT 令牌失败); response.setStatus(401); return false; } log.info(解析JWT令牌 成功 放行); return true; } }拦截器配置package com.example.lotterysystem.common.config; import com.example.lotterysystem.common.interceptor.LoginInterceptor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.format.FormatterRegistry; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import java.util.Arrays; import java.util.List; Configuration public class AppConfig implements WebMvcConfigurer { Autowired LoginInterceptor loginInterceptor; private final ListString exclude Arrays.asList( /**/*.html, /css/**, /js/**, /pic/**, /*.jpg, /*.png, /favicon.ico, /**/login, /register, /verification-code/send, /acticity-detail/find ); Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(loginInterceptor) .addPathPatterns(/**) .excludePathPatterns(exclude); } }
