Das folgende Applet verwende ich bei meinen interaktiven astrologischen Seiten - wie dem Horoskoprechner (http://www.astrotexte.ch/sources/horo.jsp), um Funktionen des Servers aufzurufen. Es ist aber allgemein verwendbar und kann in Kombination mit einem Proxy-Servlet dazu verwendet werden, um auf einer Webseite Javascript-gesteuert beliebige Requests ins Web durchzuführen. [RP]

Der HTTP-Requestor

Inhalt


Beschreibung

Der HTTP-Requestor ist ein winziges Applet (3KB), das mit seiner Methode sendRequest() einen HTTP-Request ausführen und die Antwort als String zurückgeben kann. Der HTTP-Requestor schliesst somit eine Lücke im Javascript-Sprachumfang, da es ansonsten mit Javascript keine Möglichkeit gibt, HTTP-Requests auszuführen. Man kann das Applet in seine HTML-Seiten als unsichtbares Applet einbauen und hat dann die Möglichkeit, im Javascript-Code HTTP-Requests durchzuführen.

Update (25.6.2016) Natürlich verwendet man seit mindestens einer Dekade für HTTP-Requests das in den JavaScript Engines der Browser nativ eingebaute Modul XMLHttpRequest. Das HttpRequestor-Applet, das ich hier vorstelle (der Text ist vom November 2004), ist zwar auf Browsern, die Java-Applets ermöglichen, weiterhin voll funktionsfähig, wenn auch schon lange Geschichte. Aber auch Geschichtliches verdient es, dokumentiert zu werden!

Update (19.12.2011) Seit ich diese Seite schrieb, sind einige Jahre ins Land gezogen. Sicherheitsexperten bei Oracle haben sich neue, clevere Mechanismen ausgedacht, um Missbrauch zu verhindern. Leider wurde der original verwendete Code dadurch ungültig. Software, die darauf aufbaute, erodierte. Ich musste den Code, wie er früher auf dieser Seite stand, leicht komplizieren, damit das Applet weiterhin funktioniert, wie es soll.

Hier ist der aktuelle Code:

import java.applet.Applet;
import java.net.URL;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.security.PrivilegedAction;
import java.security.AccessController;

/** Applet ohne Graphische Oberfläche zur Durchführung eines HTTP-Requests */
public class HttpRequestor extends Applet {

  public String sendRequest(final String urlstring) {
    return AccessController.doPrivileged(
      new PrivilegedAction() {
          public String run() {
              return doRequest(urlstring);
          }
        } );   
    }

  private String doRequest(String urlstring) {
    String response = "";
    String line = "";
    URL url;
    try {
     url = new URL( urlstring );
     BufferedReader in = new BufferedReader(new InputStreamReader( url.openStream() ));
     while ((line = in.readLine()) != null)
       response += line + "\n";
     return response;
     }
     catch (Exception ex) {
       return ex.getMessage();
       }
  }

}
Wenn wir im HTML-Quelltext das folgende Applet einfügen:
<applet name="httpRequestor"
        codebase="."
        class="HttpRequestor.class"
        height="0"
        width="0">
</applet>
können wir mit Javascript leicht Requests ausführen, zum Beispiel folgendermassen:
<script type="text/javascript">
document.write( document.httpRequestor.sendRequest( "http://www.astrotexte.ch" ) );
</script>

Zum Inhaltsverzeichnis

Testinstanz

Mit der in diese Seite eingebauten Testinstanz können Sie das ausprobieren: Wenn Sie eine URL in das Eingabefeld eingeben und "Absenden" drücken, wird der Request ausgeführt, und Sie erhalten im Textfenster das Ergebnis des Requests als reiner Text angezeigt.

URL:

Ergebnis


Zum Inhaltsverzeichnis

Das Proxy-Servlet

Die Testinstanz zeigt einen Nachteil dieses Applets: Es führt, wie Sie leicht sehen können, nur Requests auf den Server aus, von dem es stammt. Das gehört zu den allgemeinen Sicherheitsvorkehrungen für Applets. Der Grund ist, dass Applets, die beliebige Zugriffe über HTTP ausführen könnten, die Webseiten eines Intranets ausspionieren könnten. Da ein Browser nicht feststellen kann, welche HTTP-Requests ins Intranet und welche an einen öffentlichen Webdienst gehen, werden sämtliche HTTP-Requests auf andere Rechner als den, von dem das Applet selbst stammt, verboten ("Applets can only phone home").

Wenn Sie Webservices von anderen Rechnern auswerten wollen, benötigen Sie daher einen Proxy-Service: Der Request muss auf dem Umweg über den eigenen Rechner ausgeführt werden, indem zunächst ein "serverseitiger HTTP-Requestor", und das ist eben ein Proxy, aufgerufen wird. Hier das Coding für ein sehr einfaches Proxy-Servlet:

package AstroIX;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.net.URL;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;

public class Proxy extends HttpServlet {

  private  PrintWriter out = new PrintWriter( System.out );

  public void doGet(HttpServletRequest request, HttpServletResponse response)    {

    String line;

    try {
      response.setContentType("text/plain");
      out = response.getWriter();
// URL abholen
      String urlString = request.getParameter( "url" );
      if ((urlString == null)|| urlString.equals(""))
        out.println("Fehler: Keine URL angegeben!");
      else {
        URL url = new URL( urlString );
        BufferedReader in = new BufferedReader(new InputStreamReader( url.openStream() ));
        while ((line = in.readLine()) != null)
          out.println( line );
        }

// Alles abfangen
      } catch (Throwable t) {
          t.printStackTrace( out );
          }

  }

}
Wenn Sie nun die folgende URL im obigen Eingabefeld eingeben,
http://www.astrotexte.ch/servlet/proxy?url=http://www.google.de
so erscheint der Quelltext der Startseite von Google. Wenn Sie dagegen direkt
http://www.google.de
eingeben, so greifen die Sicherheitsmassnahmen des Applets, und der Request wird nicht ausgeführt.
Zum Inhaltsverzeichnis

Was wird benötigt?

Um das Applet zu verwenden, benötigen Sie lediglich das Klassenfile HttpRequestor.class sowie eine von diesem abhängige innere Klasse HttpRequestor$1.class. Zusammen beanspruchen diese beiden Files ca. 3 KB.
http://www.astrotexte.ch/applets/HttpRequestor.class
http://www.astrotexte.ch/applets/HttpRequestor$1.class
Wenn Sie auch Requests auf andere Server ausführen wollen, müssen Sie die obige Klasse Proxy.java compilieren und auf Ihrem Server verfügbar machen.
Zum Inhaltsverzeichnis Zurück zur Homepage