最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

有关拦截器拦截指定的url并作出处理返回数据

来源:博客园

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

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


(资料图片仅供参考)

我画了一张图:

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

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

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

第一步是构建自己的 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 badfsiher17  * @Name IOSVerifyInterceptor18  * @since 2023/4/8 11:21 上午19  */20 @Slf4j21 public class IOSVerifyInterceptor implements HandlerInterceptor {22 23     private final CurriculunCache curriculunCache;25     //拦截用户26     private static final Set huids = new HashSet<>();27     //初始化数据28     static {29         huids.add("******");30     }31 32     public IOSVerifyInterceptor(CurriculunCache curriculunCache) {33         this.curriculunCache = curriculunCache;34     }35 //笔者这里只进行per的例子,其他两种效果是一样的36     @Override37     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 badfsiher13  * @Name IOSVerifyConfig14  * @since 2023/4/8 11:30 上午15  */16 @Configuration17 public class IOSVerifyConfig implements WebMvcConfigurer {18     @Autowired19     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     @Override33     public void addInterceptors(InterceptorRegistry registry) {34         //注册 35         registry.addInterceptor(new IOSVerifyInterceptor(curriculunCache)).addPathPatterns(addPathPatterns).excludePathPatterns(excludePatterns);36     }37 }

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

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

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

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

关键词: