tomcat - alles umleiten zu einem Servlet

Status
Nicht offen für weitere Antworten.

HyperHyper

Mitglied
Weis jemand wie ich Tomcat so konfigurieren kann, das alle Anfragen immer nur zu einem Servlet weitergeleitet werden? Möchte dort die URI auslesen und diese auch auswerten.
 
Code:
  <servlet-mapping>
    <servlet-name>servlet</servlet-name>
    <url-pattern>*</url-pattern>
  </servlet-mapping>
 
Danke für die Antwort. Ich habs mal ausprobiert aber leider funktioniert es nicht. Ich kann das Servlet nun überhaupt nicht mehr aufrufen. Mein Tomcat 5.0 bringt dann folgende Fehlermeldung:

Code:
SCHWERWIEGEND: Parse error in application web.xml
java.lang.IllegalArgumentException: Invalid <url-pattern> * in servlet mapping


Ich habe jetzt noch den Apache 2.2 installiert. Ich möchte gerne das Anfragen wie:

http://meinedomain.de/index.jsp
http://meinedomain.de/irgendwas/test.html
http://meinedomain.de/irgend/was/dokument.png

zu meinem Servlet "speichernservlet" umgeleitet werden. Dort möchte ich die URI dann auslesen und selber handhaben was danach mit der Anfrage geschieht.
 
RaoulDuke hat gesagt.:
Hmm, stimmt. Habs gerade mal ausprobiert. Mit /* scheint es aber zu gehen.
Also mit "/*" gehts, allerdings habe ich dann das Problem, das es nun wieder viele verschiedene geladene Servlet-Klassen gibt (siehe hier). Das ist leider nicht erwünscht. Gibts noch ne andere möglichkeit?
 
HyperHyper hat gesagt.:
Also mit "/*" gehts, allerdings habe ich dann das Problem, das es nun wieder viele verschiedene geladene Servlet-Klassen gibt (siehe hier). Das ist leider nicht erwünscht. Gibts noch ne andere möglichkeit?

Ich verstehe dein Problem, auch das aus dem anderen Thread, nicht. Ich hab meinem Servlet jetzt mal eine init() Methode gegeben und lasse init() eine Meldung ausgeben wenn es aufgerufen wird. Und egal über welche URL ich das Servlet aufrufe, init() wird genau ein einziges mal aufgerufen und dann nie wieder.

Es gibt also nur ein einziges Servlet das über verschiedene URIs angesprochen werden kann.
 
Ich versteh das Problem aus dem anderen Beitrag eigentlich auch nicht :wink:

Ich habe mal nun mit dem "/*" Eintrag gearbeitet, und jedesmal wenn ich von einem anderen Browser zugreife auf meinen Tomcat wird die Init() neu gestartet. Liegts vielleicht daran das ich in meinem Servlet statische Instanzvariablen benutze?
 
Kannst du mal den Code vom Servlet posten?

Wenns ein Grösseres ist, dann nimm doch einfach mal allen Code raus den wir hier erstmal nicht brauchen.
 
Code:
package xyz.project.speichersystem;

import org.apache.log4j.*;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.SingleThreadModel;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;




public class SpeicherServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
	 private static final String CONTENT_TYPE ="text/html; charset=UTF-8";
	 private static Logger log = Logger.getRootLogger();
	 private static int speicherMaximumSize;
	 protected static Speicher singletonSpeicher;
	
	 

	 public void init( ) throws ServletException
	 {
		 
		 
		 log.info("Initialisiere Speicher...");
		 
		 try
		 { 
			 
			
			 singletonSpeicher = Speicher.getInstance();
			 // lege die Grösse des Speichers fest
			 singletonSpeicher.setSpeicherMaximumSize(speicherMaximumSize);
			
			 
		 }
		 
		 catch (SpeicherException x)
		 {
			 log.error("Fehler beim erzeugen des singletonSpeicher aufgetreten: ", x);
			 System.exit(1);
		 }
		
		 
		 log.info("Speicher wurde erfolgreich initialisiert!");
		 
		 
	 } 
	 
	 
	 
	
	public SpeicherServlet() {
		super();
	}   	

	
  
	public synchronized void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
	        // füge den aktuellen Request meinem Speicher hinzu (wird dort ausgewertet)
		    	singletonSpeicher.addSpeicherObject(request);
		    	// zeige den Inhalt vom Speicher an
		    	singletonSpeicher.showContent();
		
	}  	
	
	
	
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// weiterleiten an doGet
		doGet(request,response);
	}  	  	    
	
	

	
	
	public void readXMLConfig()
	{
		
		// liest nur eine XML-Datei ein und legt dadurch den speicherMaximumSize fest
		
	} 


} // .EOF
 
HyperHyper hat gesagt.:
RaoulDuke hat gesagt.:
Hmm, stimmt. Habs gerade mal ausprobiert. Mit /* scheint es aber zu gehen.
Also mit "/*" gehts, allerdings habe ich dann das Problem, das es nun wieder viele verschiedene geladene Servlet-Klassen gibt (siehe hier). Das ist leider nicht erwünscht. Gibts noch ne andere möglichkeit?

Wie sieht´s denn in der 'web.xml' aus? Ist in den <servlet>-Tags evtl. <load-on-startup> gesetzt?
 
Wie sieht´s denn in der 'web.xml' aus? Ist in den <servlet>-Tags evtl. <load-on-startup> gesetzt?

Das sollte eigentlich nichts ändern. Mit load-on-startup wird das Servlet beim Start des Tomcat initialisiert, ohne beim ersten Aufruf. In beiden Fällen dürfte init() nur einmal durchlaufen werden.
 
HyperHyper hat gesagt.:
Also mit "/*" gehts, allerdings habe ich dann das Problem, das es nun wieder viele verschiedene geladene Servlet-Klassen gibt. Das ist leider nicht erwünscht. Gibts noch ne andere möglichkeit?

RaoulDuke hat gesagt.:
Wie sieht´s denn in der 'web.xml' aus? Ist in den <servlet>-Tags evtl. <load-on-startup> gesetzt?

Das sollte eigentlich nichts ändern. Mit load-on-startup wird das Servlet beim Start des Tomcat initialisiert, ohne beim ersten Aufruf. In beiden Fällen dürfte init() nur einmal durchlaufen werden.

Reden wir von verschiedenen Servlet-Klassen oder verschiedenen Servlet-Instanzen?
 
Lies doch mal den Thread ganz durch. 😉

Also, so wie ich das bisher verstanden habe hat HyperHyper ein einziges Servlet, auf das alle Anfragen der Webapplikation gemappt werden. Und er hat jetzt den Effekt das bei jeder Anfrage, die immer an das gleiche Servlet gehen sollte, die init() Methode des einen Servlets aufgerufen wird.

Es sollte dementsprechende also eine Servlet Klasse geben von der genau eine Instanz existieren sollte.
 
HLX hat gesagt.:
HyperHyper hat gesagt.:
RaoulDuke hat gesagt.:
Hmm, stimmt. Habs gerade mal ausprobiert. Mit /* scheint es aber zu gehen.
Also mit "/*" gehts, allerdings habe ich dann das Problem, das es nun wieder viele verschiedene geladene Servlet-Klassen gibt (siehe hier). Das ist leider nicht erwünscht. Gibts noch ne andere möglichkeit?

Wie sieht´s denn in der 'web.xml' aus? Ist in den <servlet>-Tags evtl. <load-on-startup> gesetzt?
Also wenn ich:
Code:
<load-on-startup>1</load-on-startup>

hinzufüge, dann wird beim starten vom Tomcat meine Init() gleich 2x ausgeführt (Zeilen 12-13 und 30-31)!

Code:
26.09.2006 14:15:15 org.apache.coyote.http11.Http11Protocol init
INFO: Initializing Coyote HTTP/1.1 on http-8080
26.09.2006 14:15:15 org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 2423 ms
26.09.2006 14:15:15 org.apache.catalina.core.StandardService start
INFO: Starting service Catalina
26.09.2006 14:15:15 org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/5.0.28
26.09.2006 14:15:15 org.apache.catalina.core.StandardHost start
INFO: XML validation disabled
0    [main] INFO  root  Initialisiere Speicher...
30   [main] INFO  root Speicher wurde erfolgreich initialisiert!
26.09.2006 14:15:17 org.apache.catalina.core.StandardHost getDeployer
INFO: Create Host deployer for direct deployment ( non-jmx ) 
26.09.2006 14:15:17 org.apache.catalina.core.StandardHostDeployer install
INFO: Processing Context configuration file URL file:C:\Programme\Apache Software Foundation\Tomcat 5.0\conf\Catalina\localhost\admin.xml
26.09.2006 14:15:17 org.apache.struts.util.PropertyMessageResources <init>
INFO: Initializing, config='org.apache.struts.util.LocalStrings', returnNull=true
26.09.2006 14:15:17 org.apache.struts.util.PropertyMessageResources <init>
INFO: Initializing, config='org.apache.struts.action.ActionResources', returnNull=true
26.09.2006 14:15:18 org.apache.struts.util.PropertyMessageResources <init>
INFO: Initializing, config='org.apache.webapp.admin.ApplicationResources', returnNull=true
26.09.2006 14:15:20 org.apache.catalina.core.StandardHostDeployer install
INFO: Processing Context configuration file URL file:C:\Programme\Apache Software Foundation\Tomcat 5.0\conf\Catalina\localhost\balancer.xml
26.09.2006 14:15:20 org.apache.catalina.core.StandardHostDeployer install
INFO: Processing Context configuration file URL file:C:\Programme\Apache Software Foundation\Tomcat 5.0\conf\Catalina\localhost\manager.xml
26.09.2006 14:15:20 org.apache.catalina.core.StandardHostDeployer install
INFO: Installing web application at context path /SpeicherSystem from URL file:C:/Programme/Apache Software Foundation/Tomcat 5.0/webapps/SpeicherSystem
0    [main] INFO  root  Initialisiere Speicher...
10   [main] INFO  root Speicher wurde erfolgreich initialisiert!
26.09.2006 14:15:20 org.apache.catalina.core.StandardHostDeployer install
INFO: Installing web application at context path /jsp-examples from URL file:C:\Programme\Apache Software Foundation\Tomcat 5.0\webapps\jsp-examples
26.09.2006 14:15:20 org.apache.catalina.core.StandardHostDeployer install
INFO: Installing web application at context path  from URL file:C:\Programme\Apache Software Foundation\Tomcat 5.0\webapps\ROOT
26.09.2006 14:15:20 org.apache.catalina.core.StandardHostDeployer install
INFO: Installing web application at context path /servlets-examples from URL file:C:\Programme\Apache Software Foundation\Tomcat 5.0\webapps\servlets-examples
26.09.2006 14:15:21 org.apache.catalina.core.StandardHostDeployer install
INFO: Installing web application at context path /tomcat-docs from URL file:C:\Programme\Apache Software Foundation\Tomcat 5.0\webapps\tomcat-docs
26.09.2006 14:15:21 org.apache.catalina.core.StandardHostDeployer install
INFO: Installing web application at context path /webdav from URL file:C:\Programme\Apache Software Foundation\Tomcat 5.0\webapps\webdav
26.09.2006 14:15:21 org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on http-8080
26.09.2006 14:15:21 org.apache.jk.common.ChannelSocket init
INFO: JK2: ajp13 listening on /0.0.0.0:8009
26.09.2006 14:15:21 org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=10/170  config=C:\Programme\Apache Software Foundation\Tomcat 5.0\conf\jk2.properties
26.09.2006 14:15:21 org.apache.catalina.startup.Catalina start
INFO: Server startup in 6729 ms
 
Also ich krig das so oder so nicht reproduziert. Wird jetzt bei jedem Aufruf einer URL das Init durchlaufen, oder was passiert genau?
 
Also ich habe in der web.xml nun folgendes stehen:

Code:
<servlet-mapping>
    <servlet-name>speicherservlet</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>

Egal welche URL ich nun übergebe, die Init() wird jedesmal aufgerufen. Habe ich in der web.xml die Zeile:
Code:
<load-on-startup>1</load-on-startup>
...stehen, dann wird beim starten vom Tomcat das Init() sogar 2x ausgeführt!





Habe ich nun folgenden Eintrag in der web.xml stehen:
Code:
  <servlet-mapping>
    <servlet-name>speicherservlet</servlet-name>
    <url-pattern>/speicherservlet</url-pattern>
  </servlet-mapping>

Dann wird Init() nur einmal aufgerufen, und zwar wenn der erste Request reinkommt. Allerdings kann ich dann so nicht alle Requests auf mich umleiten. Dies ist auch die Ausgangssituation meiner Frage.




Habe mal zum Test ein ganz simples Servlet angelegt:
Code:
package servlettestpackage;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class for Servlet: Testservlet
 *
 */
 public class Testservlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
    /* (non-Java-doc)
	 * @see javax.servlet.http.HttpServlet#HttpServlet()
	 */
	public Testservlet() {
		super();
	}   	
	
	
	public void init( ) throws ServletException
	 {
		System.out.println("gestartet!!!");
	 }
	
	
	/* (non-Java-doc)
	 * @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("Ein Request wurde empfangen!");
	}  	
	
	/* (non-Java-doc)
	 * @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}   	  	    
}

...und dazu folgende web.xml erzeugt:
Code:
	<servlet-mapping>
		<servlet-name>Testservlet</servlet-name>
		<url-pattern>/*</url-pattern>
	</servlet-mapping>
..und siehe da - es funktioniert! Init() wird nur 1x aufgerufen und dann auch nie mehr wieder. Ich vermute es liegt an den "statischen Instanzvariablen" im Servlet "SpeicherServlet" (das von ein paar Postings weiter oben).
 
Die statischen Variablen im Servlet sollten kein Problem sein. Ich wüsste jedenfalls keinen Grund warum die bewirken könnten das init() mehrfach aufgerufen wird. Was genau macht denn deine Speicher Klasse? Vielleicht solltest du den Code auchmal hier posten.
 
Die Speichernklasse ist nur ein kleines Singleton welches die Requests auswertet und in eine LinkedList speichert. Ich habe mal sämtlichen Code auskommentiert und teste nun woran es liegen könnte.
Allmählich habe ich das Gefühl das Eclipse mich verarscht! Manchmal deployed der nicht korrekt.
Ich teste mal alles jetzt Schritt für Schritt!
 
HyperHyper hat gesagt.:
RaoulDuke hat gesagt.:
Kann deine Speicher Klasse irgendwelche Exceptions werfen?
Ja die Speicherklasse wirft eigene Exceptions welche dann im Init() abgefangen werden.

Das hat vermutlich mit dem Problem jetzt nix zutun, aber bist du sicher das es eine gute Idee ist in einem Servlet ein System.exit() aufzurufen? Willst du den ganzen Tomcat abschiessen nur weil dein Servlet nicht startet? Ich glaub das ist ne schlechte Idee sowas zu machen.
 
Hast recht, ich werd den Befehl entfernen.

So ich denke ich hab nun rausgefunden was diese doppelten Inits() auslöst - es sind meine Singleton-Klassen!
Hier mal die Klasse "singletonSpeicher":


Code:
package xyz.project.speichersystem;

import java.io.ObjectStreamException;
import java.util.LinkedList;
import javax.servlet.http.HttpServletRequest;



public class SingletonSpeicher {
	
	private static SingletonSpeicher INSTANCE = new SingletonSpeicher();
	
	private SingletonSpeicher() 
	{
	}

	
	

	public static synchronized SingletonSpeicher getInstance() throws SingletonSpeicherException
	{
		return INSTANCE;
	}
	
	public Object clone() throws CloneNotSupportedException
    {
		throw new CloneNotSupportedException(); 
    }
	

	private Object readResolve() throws ObjectStreamException
	{
		return INSTANCE;
	}

	
	public void addSpeicherObject(HttpServletRequest request)
	{
     // Mache irgendeine Aktion
  
  }
	
} // .EOF


Wenn ich nun dieses Mapping habe:
Code:
<servlet-mapping> 
    <servlet-name>speicherservlet</servlet-name> 
    <url-pattern>/*</url-pattern> 
  </servlet-mapping>

dann läuft mein System amok. Das Init() wird ziemlich oft aufgerufen wenn ich nun eine URL an mein Servlet übergebe.

Weis jetzt jemand zufällig warum diese Klasse dafür sorgt das Init() mehrfach aufgerufen wird?
 
Also nach mehrmaligem testen bin ich nun zu der Erkenntnis gelangt, das meine Singleton-Klasse schuld an diesem Dilemma ist! Sobald ich diesen Befehl einbaue:
Code:
....
protected static Speicher singletonSpeicher;
....
...
....
singletonSpeicher = Speicher.getInstance();
ist schluss mit lustig und die ständigen Init()-Aufrufe fangen wieder an zu nerven. Das heisst wohl ich muss meine Singleton-Klasse überarbeiten (ob das geht?).
 
Kann ich so noch nix zu sagen. Was passiert denn genau in

public void addSpeicherObject(HttpServletRequest request)

?

Es ist eventuell keine gute Idee den ganzen Request zu speichern. Hol dir lieber aus dem Request die Informationen die du speichern willst schon vorher raus und übergib z.B. nur die URI an deinen Speicher.
 
Bisher findet dort noch nicht viel statt. Ist ein reiner Test. Bevor ich nicht dieses Problem gelöst habe, kann ich eh nicht weitermachen.

Code:
public class SingletonSpeicher {
  
  private static LinkedList requestList = new LinkedList();


public void addSpeicherObject(HttpServletRequest request) 
   { 
     requestList.add(request.getRequestURI());
  
  }


Der Sinn warum ich das Singleton nehme ist der, das nämlich nur eine einzige Datenstruktur existiert welche jetzt z.B. die Requests speichert, auch wenn mehrere Requests gerade gleichzeitig eintreffen und somit mehrere Servlet-Threads existieren.
Also wenns nicht mit nem Singleton geht, würde ich auch eine andere Alternative dankend annehmen.
 
Ich kann das Verhalten auch weiterhin nicht reproduzieren.

Aber im Prinzip brauchst du eigentlich kein Singleton, deine LinkedList und vieles andere ist doch sowieso schon static, da kannste auch gleich die Zugriffsmethoden static machen und dann über die static Methoden drauf zugreifen.
 
Glaub ich werd das wohl so machen müssen. Dachte ein Singleton käme eleganter rüber.
Ich versteh es auch nicht warum das nicht klappt jetzt. Scheint ein Problem mit "static" zu sein.
 
Also ich hab deine Speicher Klasse kopiert und ausprobiert, und ich kann damit genau wie schreibst die Request URIs speichern und wieder ausgeben, und mein init() wird trotzdem nur ein einziges Mal aufgerufen. Ein generelles Problem ist das also nicht.

Vielleicht machst du mir mal ein Eclipse Projekt bei dem das Problem auftritt und schickst mir das als zip, dann guck ich mal ob es sich hier aus so verhält.
 
So ich hab das ganze mal ausgiebig getestet und ich glaub ich weis nun woher der Fehler kommt! Und zwar kommt es auf die Schreibweise an, wie ich mein Projekt mit dem Browser ansteuere.

Unter Tomcat wird mein Projekt in das Verzeichnis "../webapps/SpeicherSystem/" deployed. Rufe ich nun im Browser die folgenden URLs auf:

http://localhost:8080/SpeicherSystem/test
http://localhost:8080/SpeicherSystem/
http://localhost:8080/SpeicherSystem/wfklsdfj
http://localhost:8080/SpeicherSystem/moooo

..wird Init() nur einmal ausgeführt und ansonsten läuft alles rund.

Rufe ich nach diesen 4 URLs nun diese URL auf:

http://localhost:8080/speichersystem/test

dann wird Init() plötzlich erneut aufgerufen. Es kommt also auf die Gross/Kleinschreibung des Verzeichnisses drauf an, in welchem das Servlet nun liegt. Anders kann ich mir das nicht erklären.

Ein weiteres Hauptproblem dürfte Eclipse 3.2 sein. Das deployment funktioniert total fehlerhaft. Ziemlich oft übernimmt es nicht die neuesten Dateien. Ich deploy immer indem ich auf den Button "publish to the server" klicke.
Da mein Projektname leider nicht klein geschrieben ist (SpeicherSystem), gibts da irgendeine möglichkeit in Eclipse einzustellen das wenn ich deploye das Verzeichnis wo dabei angelegt wird, dann komplett in Kleinbuchstaben gehalten ist?

Werd wohl ein ANT-Skript schreiben müssen (hat jemand zufällig eines?).
 
HyperHyper hat gesagt.:
Ein weiteres Hauptproblem dürfte Eclipse 3.2 sein. Das deployment funktioniert total fehlerhaft. Ziemlich oft übernimmt es nicht die neuesten Dateien. Ich deploy immer indem ich auf den Button "publish to the server" klicke.

Eclipse 3.2. scheint hier in der Tat nicht richtig zu funktionieren. I.d.R. hilft ein Neustart des Tomcat - lästig aber funktioniert.
 
Also ich habe nachgeschaut und es ist nur die Applikation "SpeicherSystem" vorhanden. Allerdings interessiert das Tomcat nicht das wenn ich "http://localhost:8080/speichersystem/test" eintippe, diese URL gar nicht geben dürfte. Tomcat nimmt diese URL ebenfalls an.
 
Das kann eigentlich nicht. Das ist case-sensitive, ich habs extra bei mir nochmal ausprobiert. Was sagt denn das Tomcat Manager Webinterface? Da kannst du doch sehen welche Applikationen alle aktiv sind.
 
Eclipse WTP ist ein fall für sich:

Schau mal im Tomcat-Temp-Verzeichnis nach. Oftmals werden die Anwendungen auf dem webapps-Verzeichnis nach tmp kopiert. Und die Anwendungen in tmp sind die welche im Browser laufen. Und gelöscht werden die Apps aus dem tmp Verzichnis nicht immer, v.a. nicht wenn diverse jars noch geladen sind (struts-jar ist mein ganz persönlicher Freund..grr).
 
So ich hab mal im Tomcat-Manager reingeschaut und siehe da - es waren 2 Anwendungen, nämlich "SpeicherSystem" und "speichersystem" aufgelistet. Habe beide entfernt und neu deployed, und man glaubt es kaum - es waren wieder beide vorhanden. :? Wenn ich nun in das .../webapp/ -Verzeichnis reinschaue ist allerdings nur das Verzeichnis "SpeicherSystem" vorhanden.
Hab sowohl vom Eclipse aus, aber auch manuell deployed und das Ergebniss war jedesmal dasselbe (1 Verzeichniss und 2 Einträge im Manager).

Denk mal das ein Konfigurationsfehler vorliegt.

Im /tomcat5.0/temp/ -Verzeichnis ist nichts drinnen.


Nachtrag:
Nachdem ich die Datei "SpeicherSystem.war" entfernt hatte und nur noch das Verzeichnis "speichersystem" vorhanden war, ist im Manager auch nur noch ein Eintrag vorhanden.
 
Hätte noch eine Frage zum Mapping. Und zwar wird bei diesem Mapping JEDE Anfrage weitergeleitet an mein Servlet.
Code:
<servlet-mapping> 
    <servlet-name>speicherservlet</servlet-name> 
    <url-pattern>/*</url-pattern> 
  </servlet-mapping>

Das schlechte daran ist das Webseiten welche dort vorhanden sind, nicht angesprochen werden können. Wie kann ich nun einen Filter einbauen, damit meine vorhandenen Webseiten nicht ebenfalls weitergeleitet werden?

Diese beiden Seiten sollen rausgefiltert werden:
/speichersystem/index.jsp
/speichersystem/hilfe.jsp
 
Also ich glaub der erste Filter könnte was taugen, da dieser zuverlässig z.B. meine "index.jsp" herausfiltert. Allerdings weis ich nicht wie ichs in der Methode "doFilter" anstellen soll, das nun zu "index.jsp" weitergeleitet wird und nicht zu meinem Servlet.

Hier mal der Filter im Überblick:
Code:
package xyz.project.speichersystem; 

import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.*;

/**
* Simple trace filter which prints
* output on web-server console.
*/
public class TraceFilter implements Filter {

  /**
  * Initialize simple trace filter
  * @param filter config
  */
  public void init(FilterConfig config) throws ServletException {
  }

  /**
  * Deinitialize simple trace filter  
  */
  public void destroy() {
  }

  /**
  * Handle the tracing (do filter operation)
  * @param servlet request
  * @param servlet response
  * @param filter chain
  */
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
  
    // print remote hostname
    System.out.println("Remote host = " + ((HttpServletRequest) request).getRemoteHost());
  
    
    // hier müsste der Filter nun zu z.B. "index.jsp" weiterleiten. Tut er aber nicht,
    // er leitet immer noch zum Servlet "speicherservlet" weiter.
    
    chain.doFilter(request,response);
  }
}

Der Eintrag in der "web.xml":
Code:
<filter>
		<filter-name>TraceFilter</filter-name>
		<filter-class>xyz.project.speichersystem.TraceFilter</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>TraceFilter</filter-name>
		<url-pattern>/index.jsp</url-pattern>
	</filter-mapping>



<servlet-mapping> 
    <servlet-name>speicherservlet</servlet-name> 
    <url-pattern>/*</url-pattern> 
  </servlet-mapping>
 
Ich schaus mir grad an, ist aber ziemlich schwer zu konfigurieren. In der web.xml muss das Mapping auf /* stehen, damit alle Requests auch so weitergeleitet werden, damit ich die URL rausziehen kann.

Code:
<servlet-mapping> 
    <servlet-name>speicherservlet</servlet-name> 
    <url-pattern>/*</url-pattern> 
  </servlet-mapping>

Das schwierige ist nun beim URLRewrite einen Filter zu basteln, welcher einzelne URLs wie z.B. "index.jsp" nicht an das Servlet weiterleitet.
 
So nach Stunden der Qualen (hab echt jeden Sch**** ausprobiert) bin ich dann ENDLICH auf die einfachste Lösung gekommen.

Code:
<servlet-mapping> 
    <servlet-name>speicherservlet</servlet-name> 
    <url-pattern>/ss/*</url-pattern> 
  </servlet-mapping>

Aufrufe der Art:
http://localhost:8080/speichersystem/ss/test
http://localhost:8080/speichersystem/ss/irgendwas.html

werden wie gewohnt ans Servlet weitergeleitet.

Und Aufrufe dieser Art:
http://localhost:8080/speichersystem/index.html
http://localhost:8080/speichersystem/admin.jsp

werden NICHT mehr an dieses elende §$&!)$% Servlet weitergeleitet.

Eigentlich total simpel, aber sowas übersieht man halt viel zu leicht (hätte wohl gestern doch nicht soviel auf der Wiesn bechern sollen :lol: ). :bae:
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben