Spring boot拦截器的实现

Spring boot自带HandlerInterceptor,可通过继承它来实现拦截功能,其的功能跟过滤器类似,但是提供更精细的的控制能力。

1.注册拦截器

  1. @Configuration
  2. public class MyWebAppConfigurer extends WebMvcConfigurerAdapter {
  3. @Bean //把我们的拦截器注入为bean
  4. public HandlerInterceptor getMyInterceptor(){
  5. return new Interceptor();
  6. }
  7.  
  8. @Override
  9. public void addInterceptors(InterceptorRegistry registry) {
  10. // addPathPatterns 用于添加拦截规则, 这里假设拦截 /url 后面的全部链接
  11. // excludePathPatterns 用户排除拦截
  12. registry.addInterceptor(getMyInterceptor()).addPathPatterns("/**");
  13. super.addInterceptors(registry);
  14. }
  15. }

2.创建拦截器,写要过滤的请求等

  1. public class Interceptor implements HandlerInterceptor {
  2.  
  3. private Logger logger = LoggerFactory.getLogger(URLInterceptor.class);
  4.  
  5. public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
  6. throws Exception {
  7. // TODO Auto-generated method stub
  8.  
  9. }
  10.  
  11. public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
  12. throws Exception {
  13. // TODO Auto-generated method stub
  14.  
  15. }
  16.  
  17. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
  18. String flag = null;
  19. flag = request.getParameter("auth");
  20. if(StringUtils.isEmpty(flag) || !flag.equals("php")){
  21. logger.error("error-auth:{}", flag);
  22. return false;
  23. } else {
  24. logger.info("通过校验!");
  25. return true;
  26. }
  27. }
  28. }

3.取消拦截

上面是拦截所有接口,如果想某个接口取消拦截,怎么办?

新建一个类

  1. @Target(ElementType.METHOD)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. public @interface UnAuthority {
  4.  
  5. }

4.在不需要拦截的方法上面添加新增的注解,如下

  1. @UnAuthority
  2. @RequestMapping("/hello")
  3. public String hello(){
  4. return "Hello World";
  5. }

5.修改拦截器的preHandle方法,如下

  1. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
  2.  
  3. // 检测请求的方法是否有UnAuthority注解,有注解不拦截,直接放行,返回true。
  4. HandlerMethod handlerMethod = (HandlerMethod)arg2;
  5. Method method = handlerMethod.getMethod();
  6. UnAuthority unAuthority = method.getAnnotation(UnAuthority.class);
  7. if(unAuthority != null ){
  8. return true;
  9. }
  10.  
  11. String flag = null;
  12. flag = request.getParameter("auth");
  13. if(StringUtils.isEmpty(flag) || !flag.equals("php")){
  14. logger.error("error-auth:{}", flag);
  15. return false;
  16. } else {
  17. logger.info("通过校验!");
  18. return true;
  19. }
  20. }

6.不需要auth参数访问/hello接口,成功。

新增了无需拦截的注解后,就可以根据业务需求哪些是需要拦截,哪些是不需要拦截

参考:https://blog.csdn.net/wsbgmofo/article/details/79151947

Spring boot拦截器的实现的更多相关文章

  1. 【spring boot】spring boot 拦截器

    今日份代码: 1.定义拦截器 import com.alibaba.fastjson.JSON; import org.apache.commons.collections.CollectionUti ...

  2. spring boot拦截器配置

    1.在spring boot配置文件application.properties中添加要拦截的链接 com.url.interceptor=/user/test 2.编写拦截器代码 ,创建UrlInt ...

  3. spring boot拦截器WebMvcConfigurerAdapter,以及高版本的替换方案(转)

    文章转自 http://blog.51cto.com/12066352/2093750 最近项目采用spring icloud,用的spring boot版本是1.5.x的,spring boot 2 ...

  4. spring boot拦截器WebMvcConfigurerAdapter,以及高版本的替换方案

    Springboot中静态资源和拦截器处理(踩了坑)   背景: 在项目中我使用了自定义的Filter 这时候过滤了很多路径,当然对静态资源我是直接放过去的,但是,还是出现了静态资源没办法访问到spr ...

  5. spring boot拦截器

    实现自定义拦截器只需要3步: 1.创建我们自己的拦截器类并实现 HandlerInterceptor 接口. 2.创建一个Java类继承WebMvcConfigurerAdapter,并重写 addI ...

  6. (22)Spring Boot 拦截器HandlerInterceptor【从零开始学Spring Boot】

    上一篇对过滤器的定义做了说明,也比较简单.过滤器属于Servlet范畴的API,与Spring 没什么关系.     Web开发中,我们除了使用 Filter 来过滤请web求外,还可以使用Sprin ...

  7. Spring boot 拦截器和过滤器

    1. 过滤器 Filter介绍 Filter可以认为是Servlet的一种“加强版”,是对Servlet的扩展(既可以对请求进行预处理,又可以对处理结果进行后续处理.使用Filter完整的一般流程是: ...

  8. spring boot 拦截器

    @SpringBootApplicationpublic class Application extends WebMvcConfigurerAdapter { public static void ...

  9. 九、 Spring Boot 拦截器

    过滤器属于Servlet范畴的API,与spring 没什么关系. Web开发中,我们除了使用 Filter 来过滤请web求外,还可以使用Spring提供的HandlerInterceptor(拦截 ...

随机推荐

  1. SpringBoot第一天

    一,SpringBoot 介绍 1,如果使用 Spring 开发一个"HelloWorld"的 web 应用: • 创建一个 web 项目并且导入相关 jar 包.SpringMV ...

  2. java虚拟机学习笔记(四)---回收方法区

    Java虚拟机规范中规定不要求虚拟机在方法区实现垃圾收集,而且在方法区实现垃圾收集性价比确实很低.在堆中,尤其是新生代,一次垃圾收集可以回收75%-95%的空间,而永久代的垃圾回收效率远低于此. 永久 ...

  3. Jersey用户指南学习笔记1

    Jersey用户指南是Jersey的官方文档, 英文原版在这:https://jersey.github.io/documentation/latest/index.html 中文翻译版在这:http ...

  4. ASP.NET Core 框架本质学习

    本文作为学习过程中的一个记录. 学习文章地址: https://www.cnblogs.com/artech/p/inside-asp-net-core-framework.html 一. ASP.N ...

  5. JSP前端数据本地排序

    在前端中我们经常需要数据的排序,首先写引入我写好的js $(function($) { $('#sclazzId').val($('#voId').val()); document.getElemen ...

  6. 面试java后端面经_1

    1 自我介绍(建议提前准备:没准备的可以这样说:来自某学校 姓名 专业 学的啥 为啥学 自己陆陆续续开发的项目 毕业将近 找工作 在哪看到贵公司的招聘 准备了啥 大概这样) 例子:您好!我是来自XXX ...

  7. ThreadLocal中优雅的数据结构如何体现农夫山泉的广告语

    本篇文章主要讲解 ThreadLocal 的用法和内部的数据结构及实现.有时候我们写代码的时候,不太注重类之间的职责划分,经常造出一些上帝类,也就是什么功能都往这个类里放.虽然能实现功能但是并不优雅且 ...

  8. (四十二)c#Winform自定义控件-进度条扩展

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...

  9. 关于C#中的“?”

    目录 1. 可空类型修饰符(T?) 2. 三元(运算符)表达式(?: ) 3. 空合并运算符(??) 4. NULL检查运算符(?.) 关于C#中的"?" shanzm-2019年 ...

  10. 如何配置sigar在Linux和Windows下使用java语言获得各种系统信息

    转自:https://blog.csdn.net/qq_27093465/article/details/70227619