Java 为什么';DispatcherServlet调用我的HandlerInterceptor吗?
我知道在JavaEE中,过滤器可以拦截对servlet的任何请求。但是SpringMVC中的拦截器并不完全相同。如果您查看下图,您将看到拦截器位于DispatcherServlet之后 在我提问之前,让我给你举个例子 我有一个控制器,其中有两个方法映射到两个不同的请求。一个接受GET请求,另一个接受POST请求。现在,若我在我的web应用程序中添加一个拦截器,那个么该拦截器将位于控制器之前。这意味着在命中控制器方法之前,首先一个Java 为什么';DispatcherServlet调用我的HandlerInterceptor吗?,java,spring-mvc,interceptor,Java,Spring Mvc,Interceptor,我知道在JavaEE中,过滤器可以拦截对servlet的任何请求。但是SpringMVC中的拦截器并不完全相同。如果您查看下图,您将看到拦截器位于DispatcherServlet之后 在我提问之前,让我给你举个例子 我有一个控制器,其中有两个方法映射到两个不同的请求。一个接受GET请求,另一个接受POST请求。现在,若我在我的web应用程序中添加一个拦截器,那个么该拦截器将位于控制器之前。这意味着在命中控制器方法之前,首先一个请求将命中我的拦截器的预处理方法 现在,假设在我的应用程序中,有两种
请求
将命中我的拦截器的预处理
方法
现在,假设在我的应用程序中,有两种控制器方法如下所示:
@Controller
public class myController{
@RequestMapping(value = "/test", method = RequestMethod.GET)
public String test1(){
return "abc";
}
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String test1(){
return "xyz";
}
假设我有一个简单的拦截器,如下所示:
public class URLInterceptors extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("REQUESTED SERVLET PATH IS: " + request.getServletPath());
return true;
}
}
现在,如果我向/test
发出GET请求,我的拦截器将被命中并打印servlet路径,但是当我向/login
发出GET
请求时,我知道它将失败,因为我处理/login
映射的方法只接受POST
请求,然而,在抛出'405请求方法'GET'not supported'错误之前,它至少应该首先命中我的拦截器?没有。我不想将POST
更改为GET
。所以问题是为什么
这一部分在
DispatcherServlet
通过使用HandlerMapping
(参见您的图形)尝试为您的请求找到合适的处理程序。这些处理程序实际上是适配器,将实际的处理程序方法(在本例中是一个带注释的方法)与您注册的拦截器打包在一起。如果找到此处理程序,则DispatcherServlet
可以继续,调用拦截器,如果需要,还可以调用处理程序方法
在您的情况下,由于您的@RequestMapping
仅限于POST请求,并且您的请求是GET,因此DispatcherServlet
无法找到适当的处理程序,因此在有机会调用任何拦截器之前返回错误
请注意
在相应的HandlerAdapter
触发处理程序本身的执行
但是您的DispatcherServlet
从未找到一个处理程序
您可能想考虑使用servlet <代码>过滤器< />代码>