当前位置: 首页 > article >正文

为什么我们在Springmvc拦截器的时候要加判断 handler instanceof HandlerMethod

在Spring MVC中,拦截器(Interceptor)的preHandlepostHandleafterCompletion方法的第三个参数是一个Object类型的handler参数。这个handler参数实际上就是处理当前请求的处理器。

在Spring MVC中,处理器不一定是HandlerMethod类型的。例如,当请求的URL对应的是一个静态资源时,处理器可能是ResourceHttpRequestHandler类型的。另外,如果你自定义了处理器类型,那么处理器也可能是你自定义的类型。

因此,如果你的拦截器的代码只适用于HandlerMethod类型的处理器,你需要在代码中加入if (handler instanceof HandlerMethod)这样的判断,以确保代码不会在处理其他类型的处理器时出错。

例如,如果你的拦截器需要获取处理当前请求的方法的注解,你可以这样写:

if (handler instanceof HandlerMethod) {

  HandlerMethod handlerMethod = (HandlerMethod) handler;

  MyAnnotation annotation = handlerMethod.getMethodAnnotation(MyAnnotation.class);

  // ...

}

在这个例子中,如果没有if (handler instanceof HandlerMethod)这样的判断,当处理器不是HandlerMethod类型的时候,代码就会出错。

HandlerMethod

在Spring MVC中,HandlerMethod是一个特殊的处理器类型,它用于处理由@RequestMapping注解(或其变体,如@GetMapping@PostMapping等)标注的方法。

当一个HTTP请求到达Spring MVC时,Spring MVC需要找到一个处理器来处理这个请求。如果这个请求的URL匹配了某个@RequestMapping注解的路径,那么Spring MVC会创建一个HandlerMethod对象来处理这个请求。

HandlerMethod对象包含了处理请求的方法和这个方法所在的bean。当请求被处理时,Spring MVC会调用HandlerMethod对象的invoke方法,这个方法会调用原始的@RequestMapping方法来处理请求。

因此,HandlerMethod是Spring MVC处理由@RequestMapping注解标注的方法的关键部分。

ResourceHttpRequestHandler

ResourceHttpRequestHandler是Spring MVC用于处理静态资源请求的处理器。在Spring MVC的配置中,我们可以定义一个或多个ResourceHttpRequestHandler来处理不同路径的静态资源请求。

以下是一个在Spring MVC的Java配置中使用ResourceHttpRequestHandler的示例:

import org.springframework.context.annotation.Configuration;

import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;

import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration

public class WebConfig implements WebMvcConfigurer {

  @Override

  public void addResourceHandlers(ResourceHandlerRegistry registry) {

    registry.addResourceHandler("/resources/**")

        .addResourceLocations("/public", "classpath:/static/")

        .setCachePeriod(31556926);

  }

}

在这个示例中,我们定义了一个ResourceHttpRequestHandler来处理所有以/resources/开头的请求。这个处理器会在/public目录和classpath:/static/目录下查找请求的资源。我们还设置了资源的缓存期为一年(以秒为单位)。

当你的应用收到一个以/resources/开头的请求时,例如/resources/images/logo.png,Spring MVC就会使用这个ResourceHttpRequestHandler来处理这个请求,它会在/public目录和classpath:/static/目录下查找images/logo.png这个文件,如果找到了,就返回这个文件的内容。


http://www.kler.cn/news/135182.html

相关文章:

  • Google Chrome 任意文件读取 (CVE-2023-4357)漏洞
  • Transformer中WordPiece/BPE等不同编码方式详解以及优缺点
  • uvm环境获取系统时间的方法和使用案例
  • Python爬虫批量下载图片
  • Kafka快速入门
  • 利用OpenCV做个熊猫表情包 二
  • 单链表相关面试题--2.反转一个单链表
  • 深入理解MongoDB的CRUD操作
  • 五分钟,Docker安装kafka 3.5,kafka-map图形化管理工具
  • Golang中读写CSV文件的全面指南
  • 和鲸科技创始人范向伟受邀出席“凌云出海,来中东吧”2023华为云上海路演活动
  • NX二次开发UF_CAM_ask_cutter_db_object 函数介绍
  • CDN加速在社会发展中的挑战与机遇
  • 【Machine Learning in R - Next Generation • mlr3】
  • PDF/X、PDF/A、PDF/E:有什么区别,为什么有这么多格式?
  • 树莓派4b编译FFmpeg支持硬件编解码
  • 极智嘉(Geek+)官宣重磅合作伙伴,再度赋能仓储自动化解决方案落地
  • 查询数据库DQL
  • 不爱的人在一起会幸福吗
  • 网络安全(大厂面试真题集)
  • JOSEF 同步检查继电器 JT-1 额定电压100V 柜内固定安装,板前接线
  • List 函数排序操作,用对方法事半功倍!
  • 【Linux】-进程间通信-命名管道文件(没有关系的进程间进行通信),以及写一个日志模板
  • VSCode打开Json 文件格式化
  • CDN的发展和作用。当前网站被攻击适用什么样的CDN。
  • websocket详解
  • 一图多码如何分解?快速做二维码解码的方法
  • 2023 年最新 MySQL 数据库 Windows 本地安装、Centos 服务器安装详细教程
  • 若依ruoyi框架增加2个以上的数据源配置
  • Vue3-shallowRef 和 shallowReactive函数(浅层次的响应式)