2017-01-13 5 views
0

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?

enter image description here

Antwort

2

Ein Teil davon in

Zusammengefasst die DispatcherServlet Versuche einen geeigneten Handler für Ihre Anfrage zu finden, indem eine HandlerMapping (siehe Ihre Grafik mit). Diese Handler sind tatsächlich Adapter, die die eigentliche Handler-Methode (eine in diesem Fall @RequestMapping annotierte Methode) mit den von Ihnen registrierten Interzeptoren umhüllen. Wenn dieser Handler gefunden wird, kann DispatcherServlet fortfahren, Interzeptoren aufrufen und, falls erforderlich, Ihre Handler-Methode aufrufen.

In diesem Fall kann

Beachten Sie, dass die javadoc Staaten

A HandlerInterceptor vor dem entsprechenden HandlerAdapter aufgerufen wird, löst die Ausführung des Handlers selbst.

aber Ihre DispatcherServlet hat nie einen Handler gefunden, mit zu beginnen.

Vielleicht möchten Sie stattdessen ein Servlet Filter verwenden.

Verwandte Themen