2010-06-02 7 views
6

Ich mache einen Dienst, der unter anderem über die Funktion "Fotoalben" verfügt, die den Benutzern Fotos bereitstellt. Der Benutzer muss "erlaubt" sein, das Foto aus dem Album zu sehen. Das Senden des direkten Links zu einer anderen Person sollte nicht erlauben, ein Foto anzusehen.Tomcat gesicherter statischer Inhalt

Fotos werden im Ordner außerhalb des Kontexts gespeichert.

Was ich tun muss, ist, einige Prüfungen durchzuführen, wenn der Benutzer das Foto anfordert, und wenn die Prüfungen in Ordnung sind - dienen Sie die Datei. Ich möchte vermeiden, ein Rad zu machen, und Tomcat einfach das Bild liefern lassen, wie es normalerweise für statische Dateien tut. Kannst du dazu einen Rat geben?

+0

Welche Informationen werden diese Kontrollen brauchen und wo sind diese Informationen gespeichert? – BalusC

+0

Nur Sitzung.Der Benutzer muss registriert sein und muss in seinem Profil, das das Sitzungsobjekt ist, Zugriff haben. – Juriy

Antwort

8

Ok, Leute.

Nachdem ich mit dieser Frage hart gekämpft habe, denke ich, dass ich endlich herausgefunden habe, was ich tun kann, um es zu lösen. Zunächst sieht es so aus, als würde sich die Frage in zwei unabhängige Aufgaben zerlegen. Einer von ihnen sichert den Zugriff auf einige Ressourcen und der zweite ist das Zuführen von Ressourcen aus dem Ordner außerhalb des Kontextes.

Erste Aufgabe ist trivial und kann gelöst werden, indem man einen einfachen Filter schreibt, der an "/" gehangen wird.

Zweite Aufgabe ist viel weniger trivial, aber zum Glück kann auch gelöst werden. Tomcat verwendet die Implementierung von javax.naming.directory.DirContext, um alle Ressourcen der angegebenen Webanwendung einschließlich Klassendateien zu laden. Außerdem können Sie die benutzerdefinierte Implementierung dieser Schnittstelle bereitstellen und sie in der Datei context.xml konfigurieren. Die Standardimplementierung ist org.apache.naming.resources.FileDirContext. Details hier: http://tomcat.apache.org/tomcat-6.0-doc/config/resources.html

Ich habe meine eigene Implementierung von DirContext erstellt, indem ich einfach FileDirContext erweitert habe. Glücklicherweise gab es eine einzige Methode, die überschrieben werden musste, um die Dateientdeckung "einzubinden". Die Methode heißt Datei().

Ich poste meinen Testcode hier. Es ist bei weitem nicht perfekt und berücksichtigt nicht die Eckfälle wie das Umbenennen von Dateien, aber ich denke nicht, dass diese unter einer normalen Ausführung des Servers benötigt werden.

Die Grundidee in diesem Code ist zu überprüfen, ob der Pfad mit "virtuellen Verzeichnis" Präfix beginnt und wenn - suchen Sie nach Datei an der anderen Stelle im Dateisystem (ich weiß, es gibt einige doppelte Code dort, aber ich hoffe Sie sind nicht so faul, es zu entfernen, wenn Sie es jemals verwenden möchten :-). setVirtualName und setVirtualBase werden automatisch aufgerufen, um die Konfigurationsparameter zu injizieren.

Nachdem Sie diese Klasse an Ort und Stelle haben, müssen Sie es kritzeln und dieses Glas in den Tomcat lib-Ordner stellen. Aus offensichtlichen Gründen kann es nicht zusammen mit der Kriegsakte verwendet werden. In Ihrem context.xml sollten Sie eine Config-Zeilen wie diese hinzu:

<?xml version="1.0" encoding="UTF-8"?> 
<Context antiResourceLocking="true" antiJARLocking="true"> 

    <Resources 
      className="com.juriy.tomcat.virtualdir.VirtualFolderDirContext" 
      virtualName="/upload" 
      virtualBase="c:/temp/up"> 
    </Resources> 
    ... 
    ... 

Jetzt jederzeit Benutzer fragt nach/upload/es wird c gelöst werden: \ temp. Mit dieser Technik können Sie Lade-Ressourcen von praktisch jedem Ort implementieren: http, freigegebener Ordner, Datenbank, sogar Versionskontrollsystem. Es ist also ziemlich cool.

P.S. Ich habe den ganzen Tag getötet diese alle Arbeiten machen zusammen, so zögern Sie nicht mich, wenn Sie Ihre Stimme zu geben, wie die Antwort :-))

Prost

Juriy