这里会介绍一下用的比较多的前置拦截。

拦截器和过滤器都是对一写相应的请求处理进行一系列操作,但是会有一些先后顺序区别。

我画了一张图:

 

 

 执行的先后顺序就不做赘述了。

这次我主要正对拦截器作出一些操作。

有关我的前置拦截器的使用场景如下

 

 

第一步是构建自己的 Interceptor ,只需要构建一个类实现HandlerInterceptor。

 1import lombok.extern.slf4j.Slf4j;
 7 import org.apache.commons.io.IOUtils;
 8 import org.springframework.web.servlet.HandlerInterceptor;
 9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11 import java.io.IOException;
12 import java.util.HashSet;
13 import java.util.Set;
14 
15 /**
16  * @author badfsiher
17  * @Name IOSVerifyInterceptor
18  * @since 2023/4/8 11:21 上午
19  */
20 @Slf4j
21 public class IOSVerifyInterceptor implements HandlerInterceptor {
22 
23     private final CurriculunCache curriculunCache;
25     //拦截用户
26     private static final Set<String> huids = new HashSet<>();
27     //初始化数据
28     static {
29         huids.add("******");
30     }
31 
32     public IOSVerifyInterceptor(CurriculunCache curriculunCache) {
33         this.curriculunCache = curriculunCache;
34     }
35 
//笔者这里只进行per的例子,其他两种效果是一样的 36 @Override 37 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
// 这里是你的拦截条件
38 if(huids.contains(getHeadHuid(request))){ 39 String path = request.getServletPath(); 40
// 这里是你要组装的数据 比如我的数据就是从缓存获取一堆数据。 //matchurl是我的个人匹配逻辑 41 RedisCourseKeyEnum redisCourseKeyEnum = routeCourseCache(IOSVerifyEnum.matchUrl(path)); //输出你要的数据 43 doPackageData(response,redisCourseKeyEnum);
//这里的返回值决定是否继续后续的handler处理 false不继续 true继续
44 return false; 45 } 46 return true; 47 48 } 52 //获取标识 53 String getHeadHuid(HttpServletRequest request){55 return request.getHeader("Huid"); 56 } 57 58 //打包返回数据 59 void doPackageData(HttpServletResponse response, RedisCourseKeyEnum courseKeyEnum) { 60 response.setStatus(200); 61 response.setCharacterEncoding("UTF-8"); 62 // response.setContentType("UTF-8"); 63 String redisCaCheString = curriculunCache.getRedisCaCheString(courseKeyEnum); 64 try { 65 IOUtils.write(redisCaCheString,response.getWriter()); 66 } catch (IOException e) { 67 log.error("IOSVerifyInterceptor 数据写入异常!",e.getMessage()); 68 } 69 } 86 }

第二步把你构建的拦截器配置出去做加载

 6 import org.springframework.beans.factory.annotation.Autowired;
 7 import org.springframework.context.annotation.Configuration;
 8 import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
 9 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
10 
11 /**
12  * @author badfsiher
13  * @Name IOSVerifyConfig
14  * @since 2023/4/8 11:30 上午
15  */
16 @Configuration
17 public class IOSVerifyConfig implements WebMvcConfigurer {
18     @Autowired
19     private  CurriculunCache curriculunCache;
20 
21 //拦截路径
22     private final String[] addPathPatterns ;
23 //排除路径   
24     private final String[] excludePatterns;
25 //初始化
26     {
//这里是我初始化的拦截路径
27 addPathPatterns = IOSVerifyEnum.getIOSVerifyList(); 28
//放行路径 这里和上面的是一样的格式 29 excludePatterns = new String[]{}; 30 } 31 32 @Override 33 public void addInterceptors(InterceptorRegistry registry) { 34 //注册 35 registry.addInterceptor(new IOSVerifyInterceptor(curriculunCache)).addPathPatterns(addPathPatterns).excludePathPatterns(excludePatterns); 36 } 37 }

这两部就可以完成基础的配置。

这里要注意你的拦截的路径如果你要匹配全路径是没有问题的。

这里笔者就有遇到一些问题,比如你要匹配以“/xxxx”结尾的注意使用“/**/xxxx”,

excludePatterns 和 addPathPatterns都是可变的字符串数组,稍微注意一下就好。