Si les applications REST sont supposées être apatrides, comment gérez-vous les sessions?
j'ai besoin d'éclaircissements. J'ai lu sur le repos, et la construction des applications reposantes. Selon wikipedia, le repos lui-même est défini comme étant transfert D'État de représentation . Je ne comprends donc pas tout cela apatride gobbledeygook que tout le monde continue à vomir.
de wikipedia:
à tout moment, un client peut être en transition entre application ou "au repos". Un client dans un État de repos est capable de interagir avec son utilisateur, mais ne crée pas de charge et consomme pas par client stockage sur l'ensemble des serveurs ou sur le réseau.
est-ce qu'ils disent juste de ne pas utiliser le niveau session/application Data store???
je comprends qu'un but de repos est de rendre L'accès URI cohérente et disponible, par exemple, au lieu de cacher les demandes de pagination à l'intérieur des messages, ce qui rend la page nombre d'une demande une partie de L'URI GET. Fait sens pour moi. Mais il semble que ce soit juste aller trop loin en disant que no per client data (données de session) devrait jamais être stocké côté serveur.
que se passerait-il si j'avais une file d'attente de messages, et que mon utilisateur voulait lire les messages, mais en les lisant, il voulait bloquer certains messages d'expéditeurs qui passaient à travers pour la durée de sa session? Ne serait-il pas logique de stocker cela dans un endroit du côté du serveur, et le serveur n'a-t-il envoyé que des messages (ou des ID de message) qui n'étaient pas bloqués par l'utilisateur?
dois-je vraiment envoyer la liste complète des expéditeurs de messages à bloquer chaque fois que je demande la nouvelle liste de messages? La liste de messages qui me concerne ne serait pas / ne devrait même pas être une ressource accessible au public en premier lieu..
encore une fois, j'essaie de comprendre. Quelqu'un s'il vous plaît clarifier.
mise à jour:
j'ai trouvé une question de débordement de pile qui a une réponse qui ne me permet pas tout à fait d'aller là-bas: Comment gérer l'état de REPOS qui dit que l'état client qui est important devrait tout être transféré sur chaque demande.... Ugg.. semble comme beaucoup de frais généraux... Est-ce exact??
13 réponses
l'explication fondamentale est:
aucun état de session client sur le serveur.
Par apatrides cela signifie que le serveur ne pas stocker n'importe quel état à propos de la session client sur le côté serveur.
la session client est stockée sur le client. Le serveur est apatride signifie que chaque serveur peut de tout client à tout moment, il n'y a pas de l'affinité de session ou collante sessions . Les informations de session pertinentes sont stockées sur le client et transmises au serveur au besoin.
qui n'empêche pas d'autres services que le serveur web parle de maintenir l'état sur les objets d'affaires tels que les chariots de magasinage, tout simplement pas sur l'application actuelle/l'état de session du client.
Le du client L'état d'application ne doit jamais être stocké sur le serveur, mais transmis du client à chaque endroit qui en a besoin.
C'est d'où provient le ST dans REST , State Transfer . Vous transférez l'état au lieu que le serveur le stocke. C'est la seule façon de passer à des millions d'utilisateurs concurrents. si pour non autre raison, que parce que des millions de sessions est des millions de sessions.
la charge de gestion de session est amortie sur tous les clients, les clients stockent leur état de session et les serveurs peuvent servir de nombreux ordres de grandeur ou plus de clients d'une manière apatride.
même pour un service que vous pensez sera seulement besoin dans les 10 des milliers d'utilisateurs concurrents, vous devez toujours rendre votre service apatride. TEN des milliers, c'est encore des dizaines de milliers et il y aura des coûts de temps et d'espace Associés.
Stateless est la façon dont le protocole HTTP et le web en général a été conçu pour fonctionner et est une implémentation globalement plus simple et vous avez un chemin de code unique au lieu d'un tas de logique côté serveur pour maintenir un tas d'état de session.
Il y a quelques très de base de la mise en œuvre des principes:
ce ne sont pas des principes la façon dont vous respectez ces principes peut varier.
en résumé, les cinq principes clés sont:
- Donner à chaque "chose" ID
- Lier les choses ensemble
- utiliser des méthodes standard
- ressources avec représentations multiples
- communiquer sans état
il n'y a rien sur l'authentification ou l'autorisation dans le reste dissertation .
parce qu'il n'y a rien de différent de l'authentification d'une requête reposant sur une requête qui ne l'est pas. L'authentification n'est pas pertinente dans la discussion.
expliquant comment créer une application apatride pour vos besoins particuliers, est trop large pour StackOverflow.
la mise en Œuvre de Authentification et autorisation en ce qui concerne REST est encore plus trop large et diverses approches de mise en œuvre sont expliquées en détail sur l'internet en général.
Commentaires de demander de l'aide/infos sur ce qui va/doit juste être signalé comme N'Est Plus Nécessaire .
apatridie signifie que chaque requête HTTP se produit dans un isolement complet. Lorsque le client fait une requête HTTP, elle inclut toutes les informations nécessaires au serveur pour répondre à cette requête. Le serveur ne s'appuie jamais sur des informations provenant de requêtes précédentes. Si cette information était importante, le client l'aurait envoyée de nouveau dans cette demande. L'apatridie apporte également de nouvelles fonctionnalités. Il est plus facile de distribuer une application apatride sur des serveurs dont la charge est équilibrée. Un apatride l'application est également facile à mettre en cache.
il y a en fait deux types d'état. État de l'Application qui vit sur le client et état de la ressource qui vit sur le serveur.
un service web a seulement besoin de se soucier de votre état d'application lorsque vous faites réellement une demande. Le reste du temps, il ne sait même pas que vous existez. Cela signifie que chaque fois qu'un client fait une requête, elle doit inclure tous les États d'application que le serveur devra traiter. il.
état des ressources est le même pour chaque client, et sa place appropriée est sur le serveur. Lorsque vous téléchargez une image sur un serveur, vous créez une nouvelle ressource: la nouvelle image a son propre URI et peut être la cible de futures requêtes. Vous pouvez récupérer, Modifier et supprimer cette ressource par HTTP.
Espérons que cela aide à différencier ce que l'apatridie et de divers états.
est-ce qu'ils disent juste de ne pas utiliser le niveau session/application data store???
Pas de. Ils ne disent pas ça de façon insignifiante.
Ils disent ne pas définir une "session". Ne vous connectez pas. Ne pas déconnecter. Fournir les justificatifs d'identité avec la demande. Chaque demande est le seul.
Vous avez encore des magasins de données. Vous avez toujours l'authentification et l'autorisation. Vous ne perdez pas de temps à l'établissement de sessions et maintien de l'état de la session.
le fait est que chaque requête (a) est complètement isolée et (b) peut être trivialement confiée à une ferme de serveurs parallèles géants sans aucun travail réel. Apache ou calamar peuvent transmettre des requêtes reposantes autour aveuglément et avec succès.
Que faire si j'avais une file d'attente de messages, et mon utilisateur voulait lire les messages, mais comme il les lisait, voulait bloquer certains expéditeurs messages venant à travers pour la durée de sa session?
Si l'utilisateur veut un filtre, il suffit ensuite de fournir le filtre sur chaque demande.
n'aurait pas de sens ... le serveur n'a-t-il envoyé que des messages (ou des ID de message) qui n'étaient pas bloqués par l'utilisateur?
Oui. Fournir le filtre dans la requête URI RESTful.
Dois-je vraiment envoyer la totalité de la liste de message les expéditeurs à bloquer chaque fois que je demande la nouvelle liste de messages?
Oui. Quelle taille peut avoir cette "liste d'expéditeurs de messages à bloquer"? Une courte liste de PK?
une requête GET peut être très importante. Si nécessaire, vous pouvez essayer une requête POST même si cela ressemble à une sorte de requête.
vous avez absolument raison, le fait de supporter des interactions totalement sans état avec le serveur impose un fardeau supplémentaire au client. Cependant, si vous envisagez de mettre à l'échelle une application, la puissance de calcul des clients est directement proportionnelle au nombre de clients. Il est donc beaucoup plus facile de passer à un plus grand nombre de clients.
dès Que vous mettez un petit peu de responsabilité sur le serveur pour gérer certaines informations relatives à un les interactions du client, ce fardeau peut rapidement croître pour consommer le serveur.
c'est un compromis.
vue historique de la gestion de l'état d'application de l'utilisateur
Les Sessionsau sens traditionnel maintiennent l'état de l'utilisateur dans l'application à l'intérieur du serveur. Il peut s'agir de la page courante d'un flux ou de ce qui a déjà été saisi mais qui n'a pas encore persisté dans la base de données principale.
la raison de ce besoin était l'absence de normes du côté du client pour maintenir efficacement l'état sans rendre spécifique au client (c.-à-d. spécifique au navigateur).) d'applications ou de plugins.
HTML5 et XML Header Request a au fil du temps normalisé la notion de stockage des données complexes y compris application state de manière standard sur le côté client (c.-à-d. navigateur) sans recourir à aller et venir entre le serveur.
usage général des services de repos
les services de repos sont généralement appelés lorsqu'il y a une opération qui doit être effectuée ou si elle besoin de récupérer des données.
Les services de repossont destinés à être appelés par l'application côté client et non directement par l'utilisateur final.
authentification
Pour toute demande au serveur, la partie de la requête doit contenir le jeton d'autorisation. La façon dont il est mis en œuvre est propre à l'application, mais en général il s'agit d'une forme d'authentification BASIC
ou CERTIFICATE
.
Formulaire d'authentification non utilisé par les services de repos. Toutefois, comme indiqué ci-dessus RESTE services ne sont pas destinés à être appelés par l'utilisateur, mais par l'application. L'application doit gérer l'obtention du token d'authentification. Dans mon cas, j'ai utilisé des cookies avec JASPIC avec OAuth 2.0 pour me connecter à Google pour l'authentification et L'authentification HTTP simple pour des tests automatisés. J'ai également utilisé authentification en-tête HTTP via JASPIC pour les tests locaux ainsi (bien que la même l'approche peut être effectuée dans le Gardien du site)
selon ces exemples, l'authentification est gérée du côté client (bien que SiteMinder ou Google stockent la session d'authentification de leur côté), il n'y a rien qui puisse être fait à propos de cet état, mais il ne fait pas partie de l'application REST service.
demandes de recherche
les demandes D'extraction dans REST sont des opérations GET
où une ressource spécifique est demandée et est mis en cache. Il n'y a pas besoin de sessions de serveur car la requête dispose de tout ce dont elle aurait besoin pour récupérer les données: authentification et URI.
Scripts de Transaction
comme indiqué ci-dessus, l'application côté client elle-même appelle les services REST ainsi que l'authentification qu'elle gère du côté client aussi bien.
ce que cela signifie pour les services de repos [si fait correctement] est de prendre une seule demande à la REST server contiendra tout ce qui est nécessaire pour une opération utilisateur unique qui fait tout ce qui est nécessaire dans une transaction unique, un script de Transaction est ce que le modèle est appelé.
ceci est fait par le biais d'une requête POST
habituellement, mais d'autres comme PUT
peuvent également être utilisés.
beaucoup d'exemples inventés de repos (j'ai moi-même fait cela) ont essayé de suivre autant de ce qui a été défini dans le HTTP Protocole, après avoir traversé que j'ai décidé d'être plus pragmatique et laissé à GET and POST only . La méthode POST
n'a même pas besoin d'implémenter le pattern POST-REDIRECT-GET.
quoi qu'il en soit, comme je l'avais noté ci-dessus, l'application côté client sera celle qui appellera le service et elle appellera seulement la demande POST
avec toutes les données dont elle a besoin (pas à chaque fois). Ceci empêche les requêtes constantes vers le serveur.
Polling
bien que REST puisse être utilisé pour les sondages aussi, je ne le recommande que si vous devez l'utiliser en raison de la compatibilité du navigateur. Pour cela, j'utiliserais des WebSockets pour lesquels j'avais conçu un API contract pour ainsi. Une autre alternative pour les navigateurs plus anciens est CometD.
reste très abstrait. Cela aide d'avoir quelques bons, simples, exemples du monde réel.
Prenez par exemple toutes les principales applications de médias sociaux -- Tumblr, Instagram, Facebook, et Twitter. Ils ont tous une vue qui défile à jamais, où plus on descend, plus on voit de contenu, de plus en plus loin dans le temps. Cependant, nous avons tous vécu ce moment où vous perdez là où vous avez été défilés, et l'application vous réinitialise vers le haut. Comme si tu quittais l'application, et quand tu la Rouvres, tu es de retour au sommet.
la raison en est que le serveur n'a pas enregistré votre état de session. Malheureusement, votre position de défilement était juste stockée en RAM sur le client.
heureusement, vous n'avez pas besoin de vous connecter de nouveau lorsque vous vous reconnectez, mais c'est seulement parce que votre certificat de connexion stocké côté client n'a pas expiré. Supprimer et réinstaller l'application, et vous allez avoir à se connecter de nouveau, parce que le serveur n'a pas associez votre adresse IP à votre session.
vous n'avez pas de session de connexion sur le serveur, parce qu'ils respectent REST.
désormais, les exemples ci-dessus n'impliquent pas du tout un navigateur web, mais à l'arrière-plan, les applications communiquent via HTTPS avec leurs serveurs hôtes. Mon point de vue est que le reste ne doit pas impliquer les cookies et les navigateurs, etc. Il existe différents moyens de stocker l'état de session côté client.
mais parlons des navigateurs web pendant une seconde, parce que cela soulève un autre avantage majeur du repos dont personne ici ne parle.
Si le serveur a essayé de stocker l'état de session, comment est-il censé identifier chaque client?
il ne pouvait pas utiliser leur adresse IP, parce que beaucoup de gens pouvaient utiliser cette même adresse sur un routeur partagé. Alors comment, alors?
il ne peut pas utiliser L'adresse MAC pour de nombreuses raisons, pas la moindre, parce que vous pouvez être connecté à plusieurs Facebook comptes simultanément sur différents navigateurs plus l'application. Un navigateur peut facilement prétendre en être un autre, et les adresses MAC sont tout aussi faciles à mystifier.
si le serveur doit stocker un État côté client pour vous identifier, il doit le stocker en RAM plus longtemps que le temps qu'il prend pour traiter vos requêtes, ou bien il doit mettre ces données en cache. Les serveurs ont des quantités limitées de RAM et cache, sans parler de la vitesse du processeur. L'État côté serveur s'ajoute aux trois, de façon exponentielle. De Plus, si le serveur va stocker tout état de votre session, puis de les stocker séparément pour chaque navigateur et l'application que vous êtes actuellement connecté avec, et aussi pour chaque appareil que vous utilisez.
... J'espère que vous comprenez maintenant pourquoi le repos est si important pour l'évolutivité. J'espère que vous commencez à voir pourquoi l'état de session côté serveur est serveur extensibilité ce que les enclumes soudées sont à l'accélération de voiture.
c'est en pensant que "l'État" fait référence à des informations stockées dans une base de données. Non, il fait référence à toute information qui doit être dans la RAM du serveur lorsque vous l'utilisez.
apatride signifie que l'état du service ne persiste pas entre les demandes ultérieures et la réponse. Chaque demande comporte ses propres justificatifs d'identité et est authentifiée individuellement. Mais dans stateful chaque requête est connue de n'importe quelle requête antérieure. Toutes les demandes stateful sont axées sur la session, c'est-à-dire que chaque demande doit connaître et conserver les changements apportés dans les demandes précédentes.
application bancaire est un exemple d'application formelle. Lorsque le premier utilisateur connexion puis de faire l'opération et se déconnecte. Si après déconnexion de l'utilisateur va essayer de faire l'opération, il ne sera pas en mesure de le faire.
Oui, le protocole http est essentiellement un protocole apatride mais pour le rendre déclarable nous faisons de cookies HTTP. Alors, est-SAVON par défaut. Mais il peut être faire stateful également, dépend du cadre que vous utilisez.
HTTP est apatride mais nous pouvons quand même maintenir la session dans notre application java en utilisant une session différente mécanisme de suivi.
Oui, nous pouvons également maintenir la session dans webservice QU'il s'agisse de repos ou de savon. Il peut être mis en œuvre en utilisant n'importe quelle bibliothèque tierce partie ou vous pouvez mettre en œuvre par nos propres.
tiré de http://gopaldas.org/webservices/soap/webservice-is-stateful-or-stateless-rest-soap
je vois que le problème de base ici est de confondre Session avec État . Et tandis que REST spécifie que vous ne devez pas stocker le État sur le serveur, rien ne vous empêche de stocker un utilisateur Session .
gérer le État sur le serveur signifie que votre serveur sait exactement ce que le client fait (quelle page ils regardent dans lequel la section de l'application). Et c'est ce que tu ne devrais pas avoir à faire.
je suis d'accord avec les autres personnes disant que vous devriez garder le stockage de session à une taille minimale; et bien que ce soit le bon sens, il est en fait également dépendant de l'application. Donc, en bref, vous pouvez toujours garder une session avec des données mises en cache pour traiter les requêtes avec moins de charge sur le serveur, et gérer l'authentification en fournissant un token d'authentification/accès temporaire pour le client à utiliser. Chaque fois que la session/token est Expirée, en générer une nouvelle et demander au client de l'utiliser.
Quelqu'un pourrait soutenir que le client devrait mieux générer le jeton. Je dis qu'il fonctionne dans les deux sens, et il dépendra de l'application, et qui va travailler avec l'API.
aussi garder quelques données de session sensibles sur le serveur devrait être la bonne façon de faire. Vous ne pouvez pas faire confiance au client pour garder son panier qui (par exemple) contient un champ nommé "isFreeGift". Ces informations doivent être conservées sur le serveur.
le lien vidéo fourni par Santanu Dey dans sa réponse est utile. Faites attention si vous ne l'avez pas fait.
juste une remarque secondaire: il semble que toutes les réponses déjà données semblent ignorer le fait que certaines opérations pourraient causer une lourde charge sur le serveur. C'est important en termes de consommation d'énergie, de matériel et de coût (pour les serveurs loués par CPU cycle). Un un bon développeur ne devrait pas être paresseux dans l'optimisation de son application, même si l'opération peut être faite très rapidement sur un CPU moderne sur un serveur loué pour lequel ils ne paient pas sa facture d'électricité et de maintenance.
bien que la question Date de quelques années, j'espère que ma réponse sera utile.
Regardez cette présentation.
selon ce modèle - créer des ressources de repos transitoire pour gérer l'état si et quand vraiment nécessaire. Évitez les séances explicites.
la différence majeure entre stateless vs Stateful est que les données sont transmises au serveur à chaque fois. Dans le cas des apatrides, le client doit fournir toutes les infos donc beaucoup de paramètres doivent être passés dans chaque demande. Dans Stateful, le cliet passe ces paramètres Une fois et ils sont maintenus par le serveur jusqu'à ce qu'ils soient modifiés à nouveau par le client.
IMO, API devrait être apatride qui donne permet d'augmenter très rapidement.
vous devez gérer la session client du côté client. Cela signifie que vous devez envoyer des données d'authentification avec chaque requête, et que vous avez probablement, mais pas nécessairement, un cache en mémoire sur le serveur, qui associe les données d'auth aux informations d'utilisateur comme l'identité, les permissions, etc...
Ce RESTE l'apatridie contrainte est très important. Sans appliquer cette contrainte, votre application côté serveur ne sera pas échelle bien, parce que maintenir chaque session de client simple sera son talon D'Achille .
tout le concept est différent... Vous n'avez pas besoin de gérer les sessions si vous essayez d'implémenter le protocole RESTFul. Dans ce cas, il est préférable de faire la procédure d'authentification sur chaque requête (alors qu'il y a un coût supplémentaire pour elle en termes de performance - hashing mot de passe serait un bon exemple. pas une grosse affaire...). Si vous utilisez des sessions - comment pouvez-vous distribuer la charge sur plusieurs serveurs? Je parie que le protocole RESTFul est destiné à éliminer les sessions que ce soit - vous n'avez pas vraiment besoin ils... C'est pourquoi il est appelé "apatrides". Les Sessions ne sont nécessaires que lorsque vous ne pouvez pas stocker autre chose que des cookies du côté du client après qu'une requête a été faite (prenons L'exemple D'un vieux navigateur non Javascript/HTML5-supporting browser). Dans le cas D'un client RESTFul" full-featured "Il est généralement sûr de stocker base64(login:password)
du côté du client (en mémoire) jusqu'à ce que l'application soit encore chargée - l'application est utilisée pour accéder au seul hôte et le cookie ne peut pas être compromis par le tiers script...
je recommande fortement de désactiver l'authentification de cookie pour les sevices RESTFul... vérifier L'Autorité de base/Digest-cela devrait être suffisant pour les services reposant.
reste est apatride et ne maintient aucun État entre les demandes. Les cookies / en-têtes Client sont définis pour maintenir l'état utilisateur comme authentification. Supposons que le nom D'utilisateur/mot de passe du Client est validé par le mécanisme d'authentification de la troisième partie – 2e niveau OTP gerneation etc. Une fois que l'utilisateur est authentifié – headers /cookies vient au repos point de fin de service exposé et nous pouvons supposer utilisateur en tant qu'auteur depuis l'utilisateur vient avec des headers/cookies valides. Maintenant, certaines informations de l'utilisateur comme IP est soit maintenu dans le cache et après cela si la requête provient de la même Ip (adresse mac) pour les ressources listées, L'utilisateur est autorisé. Et le cache est maintenu pendant un certain temps qui est invalidé une fois le temps écoulé. Ainsi, soit le cache peut être utilisé, soit les entrées DB peuvent être utilisées pour persister les informations par rapport aux requêtes.