Das Hypertext-Transfer-Protokoll (HTTP) ist ein zustandsloses Protokoll. Dadurch kann der HTTP-Server keinen Zusammenhang zwischen einzelnen Requests eines Browsers herstellen. Jeder Request wird als eigenständig und unabhängig von vorangegangenen Requests betrachtet. Web-Anwendung bestehen jedoch in der Regel aus einer Folge von Interaktionen zwischen den Anwendern und dem Anwendungsserver. Deshalb muss der Anwendungsserver den momentanen Zustand der Anwendung sichern und einen neuen Request des Anwenders dem entsprechenden Anwendungszustand zuordnen können. Da mehrere Anwender gleichzeitig die Anwendung nutzen können, muss der Anwendungsserver in der Lage sein mehrere Anwendungszustände zu verwalten. Diese Fähigkeiten sind ein wesentliches Merkmal, was einen Anwendungsserver von einem reinen HTTP-Server unterscheidet. Der Zustand einer Anwendung kann aufgefasst werden als Belegung bestimmter Anwendungsvariablen. Bei einem Request des Anwenders müssen diesen Variablen wieder die Werte zugewiesen werden, die sie zuletzt hatten. Letztlich basiert aber auch ein Anwendungsserver auf HTTP, so dass auf ein eigentlich zustandsloses Protokoll eine Zustandsverwaltung aufgesetzt werden muss.
Die einfachste Möglichkeit besteht darin, dass der Anwender bei jedem Request seinen Zustand an den Anwendungsserver mitschickt. Dazu baut der Anwendungsserver die Variablen, die den Zustand definieren, und deren aktuelle Belegung in jede HTML-Seite ein, die er an den Browser des Anwenders sendet. Der Zustand muss in jedem Link und Formular der HTML-Seite enthalten sein, die für einen Request an den Anwendungsserver vorgesehen sind. Bei Links wird der Zustand an die URI durch ein Fragezeichen getrennt angehängt. Bei Forms ist die Verwendung eines ``Hidden''-Formelements am besten geeignet. Klickt der Anwender auf einen Link oder schickt er ein Formular ab, erhält der Anwendungsserver auf diese Weise alle Werte der Zustandsvariablen zurück. Dieses Verfahren hat jedoch zwei Nachteile: