这里会介绍一下用的比较多的前置拦截。
拦截器和过滤器都是对一写相应的请求处理进行一系列操作,但是会有一些先后顺序区别。
我画了一张图:
执行的先后顺序就不做赘述了。
这次我主要正对拦截器作出一些操作。
有关我的前置拦截器的使用场景如下
第一步是构建自己的 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都是可变的字符串数组,稍微注意一下就好。