HTTP Methoden - RFC9110
Was geschieht eigentlich wenn ich eine Webseite aufrufe?
Wir überspringen den Ersten Teil mit DNS und gehen davon aus, dass die URL bereits im DNS Cache ist. Um diese Frage zu beantworten, müssen wir uns mit den Grundlagen des HTTP-Protokolls befassen.
Der Standard HTTP-Request
Der Aufruf der Webseite beginnt im Browser. Dieser öffnet eine Netzwerkverbindung zur eingegebenen Adresse. Für diesen Schritt ist aber noch nicht die gesamte URL relevant, nur Servername (oder die IP-Adresse) und Port werden benötigt. Über diese Netzwerkverbindung wird ein HTTP-Request gesendet. HTTP ist ein textbasiertes Protokoll, deswegen kann man einfach einsehen, wie dieser Request aussieht:
GET /servlet-1.0-SNAPSHOT/ HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:101.0) Gecko/20100101 Firefox/101.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Die erste Zeile des Requests enthält die wichtigsten Informationen:
- die relative Adresse der angesprochenen Ressource auf dem Server: /servlet-1.0-SNAPSHOT. Anhand dieses Pfades bestimmt der Server, welche Datei er ausliefern oder welches Servlet er ansprechen soll.
- was mit dieser Ressource passieren soll. GET bedeutet, sie soll an den Anfragenden gesendet werden.
- die verwendete Version des HTTP-Protokolls: HTTP/1.1. Diese Information ist für eine funktionierende Kommunikation zwischen Client und Server wesentlich.
Alle weiteren Zeilen des Requests sind sogenannte Header. Sie transportieren zusätzliche Informationen, die der Server bei seiner Arbeit berücksichtigen sollte, aber nicht unbedingt muss. So enthält zum Beispiel der Header Accept-Language die Vorliebe des Benutzers, in welcher Sprache er den angefragten Inhalt sehen möchte. Der Server kann diese Information aber ignorieren und den Inhalt in einer völlig anderen Sprache zurückliefern.
In den Headern werden auch Cookies übertragen, kleine Textstücke, die ein Server im Browser hinterlegen kann und die bei weiteren Anfragen an denselben Server vom Browser an den Server zurückgesendet werden. Cookies sind die verbreitete Möglichkeit für den Server, zu bestimmen, ob zwei Anfragen vom selben Client stammen. Das HTTP-Protokoll ist zustandslos, jede Anfrage ist völlig unabhängig von allen anderen Anfragen. Wenn der Server also Informationen zwischen zwei Requests speichern muss, dann geschieht das üblicherweise durch Cookies. Im Servlet-Container werden diese durch das Session-Objekt abgebildet.
Weitere HTTP-Methoden
Alle server müssen zwingend die GET und HEAD Methoden unterstützen, alle anderen Methoden sind Optional:
Method Name | Description |
---|---|
GET | Transfer a current representation of the target resource. |
HEAD | Same as GET, but do not transfer the response content. |
POST | Perform resource-specific processing on the request content. |
PUT | Replace all current representations of the target resource with the request content. |
DELETE | Remove all current representations of the target resource. |
CONNECT | Establish a tunnel to the server identified by the target resource. |
OPTIONS | Describe the communication options for the target resource. |
TRACE | Perform a message loop-back test along the path to the target resource. |
Quelle: RFC9110
Von diesen Methoden sind GET, HEAD und POST die mit grossem Abstand häufiger verwendeten. Die meisten Anwendungen kommen ohne PUT und DELETE aus, und wenn diese Methoden doch verwendet werden, dann nur unter starken Sicherheitsvorkehrungen. Es bedarf nicht viel Fantasie, das Missbrauchspotenzial zu erkennen, wenn jeder Dateien auf Ihrem Server anlegen und löschen könnte.
Verarbeitung im Servlet-Container
Der Servlet-Container empfängt diesen HTTP-Request und erzeugt daraus ein Objekt der Klasse HttpServletRequest. Durch dieses Objekt sind alle Daten zugänglich, die im Request gesendet wurden.
Als Nächstes ermittelt der Servlet-Container anhand der Adresse in der ersten Request-Zeile, an welche Anwendung und welche Ressource der Request adressiert ist. Die Anwendung wird durch den ersten Teil der Adresse identifiziert, der Teil /servlet-1.0-SNAPSHOT, identifiziert die Ressource. Das kann ein Servlet sein, dessen urlPatterns-Attribut passt, oder bei einem GET-Request eine statische Ressource dieses Namens, die im Wurzelverzeichnis des WARs liegt.
Unter /servlet-1.0-SNAPSHOT antwortet ein Servlet. Falls noch keine Instanz dieses Servlets erzeugt wurde, erzeugt der Container nun eine. Es wird nicht für jeden Request eine neue Servlet-Instanz erzeugt, deshalb sollten man niemals Daten, die zu einem Request gehören, in Instanzvariablen speichern, denn diese könnten in einem anderen Request weiterverwendet werden.
Nun endlich so weit: Das Servlet wird aufgerufen.