为什么我们在Springmvc拦截器的时候要加判断 handler instanceof HandlerMethod
在Spring MVC中,拦截器(Interceptor)的preHandle
、postHandle
和afterCompletion
方法的第三个参数是一个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
这个文件,如果找到了,就返回这个文件的内容。