gpt4 book ai didi

java - 为什么 DispatcherServlet 不调用我的 HandlerInterceptor?

转载 作者:行者123 更新时间:2023-11-30 02:41:14 26 4
gpt4 key购买 nike

我知道在 JavaEE 中,过滤器可以拦截对 servlet 的任何请求。但 Spring MVC 中的拦截器并不完全相同。如果你看下图,你会发现拦截器出现在 Dispatcher Servlet 之后。

在问问题之前,让我先给你举个例子。

我有一个 Controller ,其中有 2 个方法,映射到两个不同的请求。一种接受 GET 请求,另一种接受 POST 请求。现在,如果我在 Web 应用程序中添加拦截器,该拦截器将位于 Controller 之前。这意味着在 Controller 方法被调用之前,首先是 request会击中我的拦截器的 preHandle方法。

现在假设在我的应用程序中,两个 Controller 方法如下所示:

@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 路径,但是当我创建 GET 时请求/login ,我知道它会失败,因为我的方法处理 /login映射仅接受 POST请求,但是在抛出“405 请求方法“GET”不支持”错误之前,它至少应该首先命中我的拦截器?事实并非如此。我我不想改变POSTGET 。那么问题是为什么?

enter image description here

最佳答案

部分内容在

中进行了解释

总而言之,DispatcherServlet尝试使用 HandlerMapping 为您的请求找到合适的处理程序(参见您的图形)。这些处理程序实际上是适配器,它们使用您注册的拦截器包装实际的处理程序方法(在本例中为 @RequestMapping 带注释的方法)。如果找到此处理程序,则 DispatcherServlet可以继续,调用拦截器,并且如果需要,调用您的处理程序方法。

就你而言,因为你的@RequestMapping仅限于 POST 请求,而您的请求是 GET,DispatcherServlet无法找到合适的处理程序,因此在有机会调用任何拦截器之前返回错误。

请注意 javadoc

A HandlerInterceptor gets called before the appropriate HandlerAdapter triggers the execution of the handler itself.

但是你的DispatcherServlet一开始就没有找到处理程序。

您可能需要考虑使用 Servlet Filter相反。

关于java - 为什么 DispatcherServlet 不调用我的 HandlerInterceptor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41645084/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com