2016-05-13 4 views
0

Bei der Arbeit haben wir diese Java-Klasse geerbt, die alle SSO-Anmeldevorgänge behandelt. Es gibt eine FiltroSegurancaGlobal.class, die zu * zugeordnet wird, zwingen alles mit einer AnmerkungWie macht man einen serverweiten Filter auf Tomcat?

@WebFilter(urlPatterns = { "/*" }) 

Die Klasse in einer JAR mit einigen anderen Klassen eingesetzt wird, um den gesamten SSO-Vorgang zu behandeln.

Kürzlich wurde ich gebeten, einen Git-Server für interne Zwecke zu installieren und zu konfigurieren, fand ich eine wirklich interessante Lösung GitBlit, die wie ein Charme funktioniert.

Hier ist die Sache, wenn ich es auf dem Server irgendwie bereitgestellt einige Anforderungen durch den Filter rutschen. Das schien unmöglich, damit ich die Filter nichts geändert:

public void doFilter(ServletRequest request, ServletResponse response, 
      FilterChain chain) throws IOException, ServletException { 
     System.out.println("filter hit"); 
} 

Während die ganze Anwendung nicht geladen wurde, wurde der Benutzer nicht auf die Login-Seite keine der Ressourcen umgeleitet (css, js) wurden geladen, aber der (Index) zeigt immer noch in den Entwicklertools Fenster mit einigen der Seite.

Wie ist das möglich? War kein Filter mit "/ *" urlPatterns, der ALLE Anfragen filtern soll?

Wie erwähnt unten habe ich versucht, die urlPatters Wechsel zunächst mit Kommentierung, dann web.xml des Servers später:

@WebFilter({"/", "*", "/*"}) 

und dann

<filter-mapping> 
    <filter-name>FiltroSegurancaGlobal</filter-name> 
    <url-pattern>/*</url-pattern> 
    <url-pattern>*</url-pattern> 
    <url-pattern>/</url-pattern> 
</filter-mapping> 

Es hat sich nichts geändert.

Durch Chrom Sondieren erkannte ich, dass die einzige Datei, die durch den Server zu kommen schien Angularjs war, durch ihre Github Suche fand ich eine NgController.java-Datei, die eine ungerade Codesegment hat:

public void renderHead(IHeaderResponse response) { 
     // add Google AngularJS reference 
     response.renderJavascriptReference(new ResourceReference(NgController.class, "angular.js")); 

Die eigentliche Die Klasse implementiert auch den "IHeaderContributor", der aus dem Apache Wicket-Paket stammt und nicht sicher ist, ob dies bei der Problembehandlung hilft.

Ich fand auch diese question, die FORWARD-Anfragen erwähnt, ich werde versuchen, dies zu überprüfen, aber ich bin immer noch nicht sicher, was los ist.

Nur ein kleiner Zusatz, es scheint, dass die richtige Lösung verwenden würde, aber diese Frage hat einen Kommentar, der besagt, dass [Filter] nur überschrieben werden kann, wenn webapp /WEB-INF/web.xml einen anderen mit demselben hat Filtername.

Das ist in diesem Fall eine unmögliche Situation, da ich bezweifle, dass die bereitgestellte App eine Filterkarte mit dem gleichen Filternamen hat.

Ich werde wahrscheinlich das Ganze auf die Valve Component migrieren, um sicherzustellen, dass es serverweit ist, aber ich verstehe immer noch nicht, was in diesem speziellen Szenario vor sich geht.

ALSO: Ich vergaß zu erwähnen, dass GitBlit eine Konsole ausgegeben hat, wenn ein Benutzer versucht, eine Verbindung herzustellen, zB: 2016-05-13 13:53:38 [INFO ] 0 repositories identified with calculated folder sizes in 5 msecs und ich habe gerade festgestellt, dass der Filter hit system.out.println ausgeführt wird, irgendwie die Anfrage von Der Browser passiert sie nicht.

+0

Ihre Frage ist nicht eindeutig. Möchten Sie einen serverweiten Filter (wie im Titel angegeben, dh sollte an einem einzigen Ort im Server konfiguriert werden und automatisch auf alle bereitgestellten WARs angewendet werden), oder möchten Sie einen WAR-weiten Filter (wie konkret in Frage). Beide sind sehr unterschiedlich und erfordern daher eine ganz andere Antwort. – BalusC

+0

Ich möchte einen serverweiten Filter, der an einem einzigen Ort im Server konfiguriert und automatisch auf alle implementierten WARs angewendet werden soll. Die Filterbeispiele und WEB.XML-Mappings wurden alle unter der web.xml des Servers und dem Jar im Ordner common.loader platziert. Ich dachte, ich hätte einen serverweiten Filter (der für alle bereitgestellten Apps funktioniert), aber aus irgendeinem Grund konnte der neue WAR (gitblit) es umgehen, was ich nicht verstehe. –

Antwort

0

Bei näherer Betrachtung von this question habe ich beschlossen, das Servlet zu einem Ventil zu migrieren.

Es war ziemlich geradlinig.

Ich werde nur erwähnen, dass ich diese zwei Zeilen Code

HttpServletRequest servletReq = valveReq.getRequest(); 
    HttpServletResponse servletRes = valveRes.getResponse(); 

Um das Ventil funktioniert wie erwartet, hinzuzufügen hatte, da die ursprünglichen Filter einige Regeln haben auf der Grundlage der Anforderung und es würde umleiten der Benutzer, wenn nicht authentifiziert.

+0

Während ich meine ursprüngliche Frage nicht beantwortete, löste dies mein Problem. Aber ich würde wirklich gerne verstehen, was vor sich geht. –

Verwandte Themen