目录
一、为什么要使用拦截器
编辑
二、拦截器的实现
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 List<String> 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 List<String> 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); } }