本篇是本人记录对于Spring的拦截器简单的使用记录,以及通过自定义注解的方式实现其拦截目的
首先看一下简单的实现
第一步:定义一个测试类,用于向后台发送请求

@RestController
public class Hello {@RequestMapping("/sayHello")public String sayHello(){return "Hello,World!";}@RequestMapping("/helloInterceptor")public String helloInterceptor(){return "访问helloInterceptor";}}

第二步:定义一个自己的拦截器,需要实现Spring提供的HandlerInterceptor接口

public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {response.setContentType("application/json; charset=utf-8");String a = request.getParameter("a");if(null != a && a.equals("a"){return true;}else {response.getWriter().print("你访问的资源需要登录");return false;}}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {}
}

这一步中,我们要求所有请求都需要带上指定的参数a,参数的值也是a,如果向后台发送到请求没有加上这个参数值的话,那么就会被拦截,反之则不会;

第三步:将上面的拦截器添加到拦截器链中,这里需要定义一个实现了WebMvcConfigurer接口的配置类

@Configuration
public class MyInterceptorConfigurer implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {//这种方式会拦截所有请求//registry.addInterceptor(new MyInterceptor());//这种方式会拦截指定的请求registry.addInterceptor(new MyInterceptor()).addPathPatterns("/helloInterceptor");}
}

好了,以上三部完成后,一个简单的web请求拦截器就已经可以使用了
接下来,启动项目,并在浏览器中进行访问

第一次请求

sayHello

OK我们看到,这次请求未被拦截,顺利执行了
这是因为我们在拦截器链中指定了只对**helloInterceptor()**的访问进行拦截

第二次请求

helloInterceptor

OK我们看到,这次的请求被拦截了,因为我们没有按要求带上指定的参数

第三次请求:

helloInterceptor?a=a

好的我们可以看到,当我们按照要求带上指定的参数后,那么请求是可以正确到达我们的目标方法的

通过上面的测试,可以看到,上面的方法虽然可以对访问请求进行拦截,但是当我们项目中的接口很多的时候,往往需要我们对大量的访问请求的进行拦截指定
那么接下来,再来看一下,如何通过注解,来实现对访问请求的拦截

首先,我们定义一个自定义的注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginIntercept {}

自定义注解的各个参数这里就不进行过多的描述了,这并不是本篇的重点;
自定义注解定义好了之后,我们首先想修改一下我们的测试类

@RestController
public class Hello {@RequestMapping("/sayHello")public String sayHello(){return "Hello,World!";}@LoginIntercept@RequestMapping("/helloInterceptor")public String helloInterceptor(){return "访问helloInterceptor";}}

注意,我们在 /helloInterceptor方法的上面,加上了我们自定义的注解,而**/sayHello**方法上面并没有加

然后对原先的拦截器方法进行修改

public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//获取方法处理器HandlerMethod handlerMethod = (HandlerMethod) handler;LoginIntercept loginIntercept = handlerMethod.getMethod()//这一步是获取到我们要访问的方法//然后根据我们制定的自定义注解的Class对象来获取到对应的注解.getAnnotation(LoginIntercept.class);//如果要访问的方法上没有加这个注解,那么就说明这个方法不需要拦截,否则就需要进行拦截if(null == loginIntercept){System.out.println("访问的方法无需拦截");return true;}else {response.setContentType("application/json; charset=utf-8");String a = request.getParameter("a");if(null != a && a.equals("a")){return true;}else {response.getWriter().print("请求被拦截");return false;}}}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {}
}

最后修改一下我们的配置类

@Configuration
public class MyInterceptorConfigurer implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyInterceptor());}
}

现在,我们的配置类将会对所有方法进行拦截,接下来我们看一下不同的访问结果



很显然,访问的结果和之前的三次访问结果一模一样,但是不同的是,当我们现在访问sayHello是,控制台输出了一句话:访问的方法无需拦截

以上就是本人对于Spring拦截器的简单实现以及通过自定义注解实现访问拦截的test记录,其中的核心分别是Spring的
HandlerInterceptor接口
及其 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) 方法
和Spring的
WebMvcConfigurer接口
及其 public void addInterceptors(InterceptorRegistry registry) 方法


Spring拦截器的实现以及通过注解实现拦截相关推荐

  1. 通过拦截器获取控制类requestMapping注解中的属性值

     1.控制类: /*** 根据id删除*/@RequestMapping(value = "/user/{id}", method = RequestMethod.DELETE,n ...

  2. SSM拦截器和过滤器结合使用-实现登录拦截操作

    我的主要思路是:使用过滤器filter实现对前台页面的拦截(包括.jsp.css.images.js),使用拦截器interceptor实现对后台所有请求的拦截(登陆请求除外). 文件位置如下,下图是 ...

  3. Spring 事务 以及拦截器的前后关系实验 Mybatis 日志拦截

    背景:当一个线程中,如果需要拦截所有当SQL日志,然后统一发送到一个同步器,就可以实现多个数据库实现同步主库,在进行红绿上线,或者灰度部署时候,可以实现生产库与测试库实时同步,从而达到实时可切换的效果 ...

  4. cloub spring 拦截器_Spring Cloud Gateway之全局异常拦截器

    /** * @version 2019/8/14 * @description: 异常拦截器 * @modified: */ @Slf4j public class JsonExceptionHand ...

  5. 拦截器 java_在Java后端如何添加拦截器

    (1)InterceptorConfig.java文件内容如下: import org.springframework.web.servlet.config.annotation.WebMvcConf ...

  6. 拦截器是干嘛用的java_拦截器、过滤器做什么的?

    1.过滤器 Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码.做一些业务逻辑判断等.其工作原理是,只要你在web.xml ...

  7. springmvc拦截器对请求参数解密_springMvc使用拦截器自定义处理参数

    前言: 这两天开发遇到一个需求,那就是在后台接收到请求后,能不能自定义添加参数呢? 我们知道request中是能获取到前端获取的参数的,但是在后端不能再往parameter中添加参数了,虽然可以使用r ...

  8. token拦截器阻止连接_如何防止广告拦截器阻止您的分析数据

    token拦截器阻止连接 TL;DR There's dataunlocker.com service coming soon (subscribe!), along with the open-so ...

  9. php拦截器配置,php 类中的各种拦截器

    1.__get($property)访问未定义的属性时调用  classlanjie{PHP 1.__get( $property ) 访问未定义的属性时调用 class lanjie { funct ...

最新文章

  1. 计算机设备管理系统报告,设备管理信息化自查报告
  2. 在Spring Boot应用程序中测试邮件代码
  3. Kubernetes 入门(4)集群配置
  4. x264编码参数大测试:03 subme与crf(c)
  5. android-studio add jar
  6. sql join中能否使用case when_SQL(五)——多表查询
  7. golang操作mongodb的驱动mongo-go-driver的事务支持和访问控制(mongodb4.0)
  8. ASP.net C# EVal关于前端绑定
  9. 笔记本摄像头计算机,笔记本摄像头怎么开
  10. 运维工程师种种尴尬的瞬间情景,你有无?
  11. kali获取同局域网设备的图片信息
  12. 缠中说禅学习整理——线段定义及划分(一)
  13. 百度漂亮的金融营销仗
  14. 服务器esxi虚拟机黑苹果性能,EXSi安装Mac打造Mac Pro
  15. springboot影院售票小程序毕业设计-附源码201532
  16. 求助:PostgreSQL崩溃问题
  17. 简单搜索app产品分析
  18. nodejs优雅的使用es6语法
  19. 个人写的JSP个人日记本分享学习经验
  20. ESP32C3 CORE+蓝牙收发+PIO

热门文章

  1. @ConditionalOnClass的使用探索 新日暮里格斗大会
  2. WPS AI 不仅能做 PPT,还能做这些你想不到的事情
  3. 自动向女友道歉!!!!——道歉信自动生成工具
  4. Fishing Master(贪心算法)
  5. 电脑强制关机后mysql_电脑强制关机后再开机后出现
  6. IIC通信协议详解[转载]
  7. java 实现图片像素大小调整并压缩图片
  8. 深度学习框架下群组行为识别算法综述
  9. shell银行账户管理程序_德国邮政 Postbank 银行 开户 中文 参考教程
  10. nkoj P3320【小挑战】丢失的珠子