为什么我们在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这个文件,如果找到了,就返回这个文件的内容。

你可能感兴趣的:(spring,mvc,spring)