Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么';DispatcherServlet调用我的HandlerInterceptor吗?_Java_Spring Mvc_Interceptor - Fatal编程技术网

Java 为什么';DispatcherServlet调用我的HandlerInterceptor吗?

Java 为什么';DispatcherServlet调用我的HandlerInterceptor吗?,java,spring-mvc,interceptor,Java,Spring Mvc,Interceptor,我知道在JavaEE中,过滤器可以拦截对servlet的任何请求。但是SpringMVC中的拦截器并不完全相同。如果您查看下图,您将看到拦截器位于DispatcherServlet之后 在我提问之前,让我给你举个例子 我有一个控制器,其中有两个方法映射到两个不同的请求。一个接受GET请求,另一个接受POST请求。现在,若我在我的web应用程序中添加一个拦截器,那个么该拦截器将位于控制器之前。这意味着在命中控制器方法之前,首先一个请求将命中我的拦截器的预处理方法 现在,假设在我的应用程序中,有两种

我知道在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 <代码>过滤器< />代码>