# Per HTTP Request auf Ressourcen innerhalb eines JARs zugreif



## Sebbi (15. Jan 2009)

Hallo,

ich habe folgendes Problem:

Ich verwende Tomcat und habe 2 Web-Projekte. Das eine liegt im /WEBINF/lib des anderen als JAR file.
Soweit, so gut. Jedoch verwende ich in beiden Projekten statische JS files, die ich nicht doppelt speichern möchte. Deshalb meine Frage:
Ist es möglich auf statische Ressourcen (JS, Images, CSS etc.), die in einem JAR Archiv liegen, per URL vom Webbrowser bzw. HTML include ( also HTTP request) aus zuzugreifen?

Danke

Sebastian


----------



## Guest (15. Jan 2009)

Das sollte gehen.

Die Ressource forderst du über ein Servlet an, z.B.:

```
[img]<%= request.getContextPath()+"/RessourceServlet?filename=meineDatei.jpg" %>[/img]
```

Im Servlet musst du dann den Request-Parameter auslesen, die Datei anfordern, den MIME-Type am Response setzen und die Daten in den OutputStream des Servlet stecken.

So müsste das Servlet funktionieren (nicht getestet):

```
protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException {
    String filename = request.getParameter("filename");
    URL fileUrl = getClass().getResource(filename); 
    if(fileUrl != null) {
        URLConnection conn = fileUrl.openConnection();
        response.setContentType(conn.getContentType());
        InputStream in = conn.getInputStream();
        OutputStream out = response.getOutputStream();
        byte[] buf = new byte[1024];
        int count = 0;
        while ((count = in.read(buf)) >= 0) {
            out.write(buf, 0, count);
        }
        out.close();
        in.close();
    }
}
```


----------



## HLX (15. Jan 2009)

Gast war ich. Forum hat wohl meinen Keks nicht erkannt.

EDIT: Beachte zur Sicherheit noch: Auf die o.g. Weise ist theoretisch JEDE Ressource in deinem Classpath aus dem Browser zugreifbar. Ggf. solltest du Pfade im Requestparameter untersagen.


----------



## Sebbi (16. Jan 2009)

Danke, so ähnlich habe ich es gemacht. Funktioniert gut 
Doch zwei Fragen bleiben noch:

1. Wie kann ich erkennen, dass der Browser die Datei schon erhalten hat, um danach ggf. ein NOCHANGED Header (oder so ähnlich) setzen? Machen das nicht die Webbrowser normal immer so? Im Moment werden immer alle Resourcen ausgeliefert.

2. Ist es auch möglich JSP Dateien dadurch zu 'serven'? Müsste ich ja dann eigentlich precompilen und die Classes mit ins JAR stecken oder?

Danke
Sebastian


----------



## HLX (16. Jan 2009)

Sebbi hat gesagt.:
			
		

> 1. Wie kann ich erkennen, dass der Browser die Datei schon erhalten hat, um danach ggf. ein NOCHANGED Header (oder so ähnlich) setzen? Machen das nicht die Webbrowser normal immer so? Im Moment werden immer alle Resourcen ausgeliefert.


Hmm...das einzige was mir hier einfällt, wäre eine Information im Cookie abzulegen oder ein Session-Attribut zu setzen.



			
				Sebbi hat gesagt.:
			
		

> 2. Ist es auch möglich JSP Dateien dadurch zu 'serven'? Müsste ich ja dann eigentlich precompilen und die Classes mit ins JAR stecken oder?


Der Browser kann weder die JSP-Dateien noch die daraus generierten Servlet-Klassen interpretieren. Der Inhalt von JSPs wird vom Servlet Container in HTML-Code umgewandelt, bevor er an den Browser geschickt werden. Wenn du die Klassen als Ressourcen anforderst erhälst du lediglich unleserlichen Binärcode.


----------

