interceptors in spring MVC
Ich versuche zu lernen Abfangjäger im Frühjahr aber nicht in der Lage, es zu verstehen. Ich habe versucht, ein Beispiel, bekomme aber keinen Erfolg. Ich habe eine einfache Abfangjäger wie
@Component("testInterceptor")
public class testInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){
//I suppose this method will be called when I open my login page so just write something here
System.out.println("Inside Interceptor...");
ModelAndView mv = new ModelAndView();
mv.addObject("name", "test name");
return true;
}
}
In meinem spring-servlet.xml ich habe
<context:component-scan base-package="com.test.interceptor" /> <mvc:interceptors> <bean class="com.test.interceptors.testInterceptor " /> </mvc:interceptors>
Auf meiner login-Seite Schreibe ich irgendwo ${name}
So, ich kann nicht einmal sehen, auch ${name} - Wert oder sysout überall.
Ich bin nicht einmal in der Lage zu verstehen, wenn postHandler oder afterCompletion Methode aufgerufen wird und wie kann ich testen Sie, bevor Sie Sie implementieren. Dies kann sein, weil ich bin neu auf Frühling und auch ich bin nicht in der Lage zu verstehen vollständig. Es wäre eine große Hilfe, wenn Sie vorschlagen, einige gute link zu Lesen, das zeigt einige Beispiele.
Vielen Dank im Voraus
Bearbeitet:
Jetzt kann ich sehen, meine sysout commnet, wenn ich rufe ich meine login-Seite, aber es zeigt die 16 mal, warum ist das so?
InformationsquelleAutor user965884 | 2011-11-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zunächst einen Blick auf die Oberfläche
HandlerInterceptor
es ist sehr gut dokumentiert! (HandlerInterceptorAdapter
ist nur eine Unterklasse, die Ihnen hilft, wenn Sie nicht wollen, um alle 3 Methoden) .Dann werden Sie feststellen, dass es 3 Methoden, die jeweils gehören zu einem Schritt in die "Verarbeitung" der Kette.
Dann werden Sie feststellen, dass Sie die falsche Methode: verwenden Sie
postHandle
stattpreHandle
.Dann werden Sie feststellen, dass die model-Karte, die Sie erstellt haben, in Ihrem filter
ModelAndView mv = new ModelAndView();
ist und nicht mit etwas, und deshalb kann es nicht funktionieren! Aber zum GlückpostHandle
hat eineModelAndView modelAndView
parameter. Und müssen Sie diesen erstellen, anstatt Ihre nicht verbundene Modell anzeigen.Vielleicht später werden Sie feststellen, dass Sie den filter erstellt zweimal. Einmal durch die Komponente scan und einmal durch xml-Deklaration. (In diesem Fall würde ich empfehlen zu entfernen, die
@Compnent
Annotation)Damit am Ende Ihre Klasse würde wie folgt Aussehen:
Am Ende werden Sie feststellen, (ich bin mir nicht 100% sicher), dass dieser interceptor wird nicht aufgerufen, für die spring security login-Anfrage (j_spring_security_check) oder sich ausloggen. Denn dies erfolgt in einer spring-security-filter, der angewendet wird, bevor alle HandlerInterceptor genannt wird.
Vielleicht, weil Sie sind, laden Sie einige Ressourcen (Bilder, css, js) obwohl ein controller.
InformationsquelleAutor Ralph
Warum nicht versuchen, indem das name-Attribut der Anfrage.
Anfrage.setAttribute("name", "test name");
InformationsquelleAutor seanxiaoxiao