Ich weiß, dass Filter in JavaEE jede Anfrage an ein Servlet abfangen können. Aber Interceptors in Spring MVC sind nicht genau gleich. Wenn Sie sich das folgende Diagramm ansehen, sehen Sie, dass Interzeptoren nach dem Dispatcher-Servlet kommen.Warum ruft DispatcherServlet meinen HandlerInterceptor nicht auf?
Lassen Sie mich Ihnen ein Beispiel geben, bevor ich meine Frage stelle.
Ich habe einen Controller, der zwei Methoden enthält, die zwei verschiedenen Anforderungen zugeordnet sind. Man akzeptiert GET-Anfragen und andere akzeptiert POST-Anfragen. Wenn ich nun einen Interceptor in meiner Webanwendung hinzufüge, wird dieser Interceptor vor dem Controller sitzen. Das heißt, bevor die Controller-Methode getroffen wird, trifft zuerst eine request
die Interceptor preHandle
Methode.
Jetzt sagen, dass in meiner app, zwei Controller Methoden wie folgt aussehen:
@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";
}
Und sagen wir mal ich eine einfache Abfangjäger wie dieses:
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;
}
}
Nun, wenn ich eine GET machen Anfrage an /test
, mein Abfangjäger wird getroffen und es druckt den Servlet Pfad, aber wenn ich eine GET
Anfrage an /login
mache, weiß ich, dass es scheitern wird, weil meine Methode, die /login
Kartierung behandelt, nur POST
akzeptiert Anfragen, aber bevor es wirft '405 Request-Methode' GET 'nicht unterstützt' Fehler, sollte es mindestens zuerst treffen meine Abfangjäger? Es tut es nicht. Ich möchte nicht POST
zu GET
ändern. Die Frage ist warum?