web-dev-qa-db-fra.com

qu'est-ce que cela signifie quand ils disent que http est apatride

J'étudie Java pour le web et il mentionne que http est sans état. Qu'est-ce que cela signifie et comment cela affecte la programmation

J'étudiais également le cadre du printemps et il mentionne que certains haricots doivent être déclarés comme haricots internes lorsque leur état change. Qu'est-ce que cela signifie?

35
John

HTTP - qui est le protocole de transport réel entre le serveur et le client - est "sans état" car il ne se souvient de rien entre les appels. [~ # ~] chaque [~ # ~] ressource à laquelle on accède via HTTP est une seule demande sans connexion filetée entre elles. Si vous chargez une page Web avec un fichier HTML qui contient trois <img> balises frappant le même serveur, il y aura quatre TCP négociées et ouvertes, quatre transferts de données, quatre connexions fermées. Il n'y a tout simplement aucun état conservé sur le serveur au niveau protocole qui permettra au serveur de vous connaître lorsque vous entrez.

(Eh bien, c'est vrai pour HTTP jusqu'à 1.0 en tout cas. HTTP 1.1 ajoute des mécanismes de connexion persistants de diverses sortes en raison des problèmes de performances inévitables qu'un protocole véritablement sans état engendre. Nous allons ignorer cela pour le moment car ils ne le font pas vraiment rendre HTTP avec état, ils le rendent simplement sans état au lieu de pur sans état.)

Pour vous aider à comprendre la différence, imaginez qu'un protocole comme Telnet ou SSH était sans état. Si vous souhaitez obtenir la liste des répertoires d'un fichier distant, vous devez, en une seule opération atomique, vous connecter, vous connecter, vous rendre dans le répertoire et exécuter la commande ls. Lorsque la commande ls a fini d'afficher le contenu du répertoire, la connexion se fermait. Si vous souhaitez ensuite afficher le contenu d'un fichier spécifique, vous devrez vous reconnecter, vous connecter, vous rendre dans le répertoire et maintenant lancer la commande cat. Une fois la commande affichant le fichier terminée, la connexion se fermait à nouveau.

Quand vous le regardez de cette façon, bien que l'objectif de Telnet/SSH, cela semble assez stupide, n'est-ce pas? Eh bien, à certains égards, c'est le cas et à certains égards, ce n'est pas le cas. Lorsqu'un protocole est sans état, le serveur peut effectuer de très bonnes optimisations et les données peuvent être réparties facilement. Les serveurs utilisant des protocoles sans état peuvent évoluer de manière très efficace, donc si les transferts de données individuels réels peuvent être très lents (ouverture et fermeture TCP ne sont PAS bon marché!), Un système global peut être très, très efficace et peut s'adapter à n'importe quel nombre d'utilisateurs.

Mais...

Presque tout ce que vous souhaitez faire autre que l'affichage de pages Web statiques impliquera des sessions et des états. Lorsque HTTP est utilisé pour son objectif d'origine (partage d'informations statiques comme des articles scientifiques), le protocole sans état a beaucoup de sens. Lorsque vous commencez à l'utiliser pour des choses comme les applications Web, les magasins en ligne, etc., l'apatridie commence à être gênante car ce sont des activités intrinsèquement avec état. En conséquence, les gens ont très rapidement trouvé des moyens d'étouffer l'état au-dessus du protocole des apatrides. Ces mécanismes ont inclus des choses comme les cookies, comme l'encodage de l'état dans les URL et le fait que le serveur lance dynamiquement des données en fonction de celles-ci, comme les demandes d'état cachées, comme ... eh bien, comme tout un tas de choses jusqu'à et y compris les plus modernes des choses comme Web Sockets.

Voici quelques liens que vous pouvez suivre pour mieux comprendre les concepts:

62

HTTP est sans état - cela signifie que lors de l'utilisation de HTTP, le point final ne se "souvient" pas de choses (telles que qui vous êtes). Il n'a pas d'état. Cela contraste avec une application de bureau - si vous avez un formulaire et que vous allez dans un autre formulaire, puis revenez en arrière, l'état a été conservé (tant que vous n'avez pas fermé l'application).

Normalement, afin de maintenir l'état dans l'application web, on utilise des cookies.

13
Oded

Un protocole sans état ne nécessite pas que le serveur conserve les informations ou l'état de chaque utilisateur pendant la durée de plusieurs demandes. Par exemple, lorsqu'un serveur Web est requis pour personnaliser le contenu d'une page Web pour un utilisateur, l'application Web peut avoir à suivre la progression de l'utilisateur d'une page à l'autre.

Une solution courante est l'utilisation de cookies HTTP. D'autres méthodes incluent les sessions côté serveur, les variables cachées (lorsque la page en cours est un formulaire) et la réécriture d'URL à l'aide de paramètres encodés en URI, par exemple, /index.php?session_id=some_unique_session_code.

ici

5
Luis

[~ # ~] http [~ # ~] est appelé protocole sans état car chaque commande est exécutée indépendamment, sans aucune connaissance des commandes précédentes. il.

Cette lacune de HTTP est corrigée dans un certain nombre de nouvelles technologies, notamment cookies .

4
ykombinator

Quand on dit que quelque chose est sans état, cela signifie généralement que vous ne pouvez pas supposer que le serveur suit n'importe quel état entre les interactions.

Par défaut, le protocole HTTP suppose un serveur vraiment sans état. Chaque demande est traitée comme une demande indépendante.

En pratique, c'est fixed par certains serveurs (la plupart d'entre eux) utilisant un cookie de suivi dans la demande pour faire correspondre un état sur le serveur avec un client spécifique. Cela fonctionne parce que les cookies fonctionnent (ils sont publiés sur le serveur à chaque demande ultérieure une fois qu'ils ont été définis sur le client).

Fondamentalement, un serveur qui n'est pas apatride est un obstacle à l'échelle. Vous devez soit vous assurer de router toutes les demandes d'un navigateur spécifique vers la même instance, soit effectuer une réplication d'arrière-plan des états. Il s'agit généralement d'un facteur limitant lors de la mise à l'échelle d'une application.

Il existe d'autres solutions pour garder une trace de l'état (voir le cookie d'état chiffré de Rails) mais, fondamentalement, si vous voulez vous développer, vous devez trouver un moyen d'éviter de suivre l'état sur le serveur :).

3
Mihai Toader