Sur le serveur, CFCs ne sont pas exemptés de la création de session automatique et la gestion des cookies
Pour une demande d'accès à des variables de session, ces conditions doivent être remplies:
- Le client doit faites une demande qui est acheminée vers ColdFusion (c'est-à-dire qu'elle atteint un
cfc
ou cfm
, pas un code HTML statique ou js).
- Il doit y avoir un
Application.cfc
dans le même répertoire ou un répertoire ancêtre de celui où se trouve le cfm
/cfc
demandé.
- Le
Application.cfc
doit permettre aux variables de session avec this.sessionmanagement = true;
Lorsque ces conditions sont remplies, ColdFusion associera la demande à une session. Il existe 3 façons cette association peut me fait:
- Le client a déjà des cookies de session valides et les envoie dans la demande. Votre code CFML peut lire les variables de session créées dans les demandes précédentes et définir de nouvelles valeurs pour les futures requêtes à lire.
- Le client est nouveau et n'a pas de cookies. ColdFusion crée un nouvel ensemble de cookies et une nouvelle portée de session. Votre code CFML peut définir des variables de session pour les futures requêtes à lire. Les nouveaux cookies sont automatiquement envoyés au client avec votre réponse.
- Le client envoie des cookies, mais ils correspondent à une session expirée. Ceci est géré comme le cas précédent. De nouveaux cookies sont envoyés et il existe une portée de session vide que votre CFML doit remplir.
Sur le client, les demandes ajax ne sont pas exempts de biscuits, soit
Le XMLHttpRequest sous-jacente obtient et définit les cookies dans le même magasin de cookies que toutes les autres demandes. Si l'URL demandée correspond au domaine, au chemin, à l'indicateur sécurisé d'un cookie, XMLHttpRequest enverra le cookie. Et s'il obtient des cookies valides en réponse, il les ajoutera.
La plupart du temps, vous les variables utilisent simplement la session sans réfléchir sur les cookies ou comment ils sont arrivés là
Donc, pour votre cas d'utilisation, si votre page login
est acheminé en interne à login.cfm
, et il y a une Application.cfc
à proximité, la portée de la session est prêt pour que vous utilisiez dès que login.cfm
commence. Vous pouvez faire
if(IsDefined("form.username") && IsDefined("form.password")) {
if(...check password [aka the hard part]...) {
session.user = form.username;
location(url="/home");
} else {
location(url="/login");
}
} else {
...print the login form...
}
Et votre code logout
peut StructDelete(session, "user")
Partout ailleurs, dans toutes vos la question de savoir si la demande d « s et cfm
», cfc
est venu d'un utilisateur connecté est simple: Si le client s'est déjà connecté et que la session n'a pas expiré, il existe session.user
. Sinon, ce n'est pas le cas (vous aurez une session - il y a toujours une session parce que ColdFusion en crée une avant d'exécuter votre code CFML - mais il n'y aura pas de variable user
jusqu'à ce que vous en mettiez une).
Vous pouvez définir d'autres variables utilisateur dans la demande de connexion (et les désactiver lors de la déconnexion), comme le vrai nom, les préférences, tout ce que vous voulez charger à partir d'une base de données fréquemment utilisée et rarement mise à jour. rester dans la portée de la session. En outre, il y a cflogin
qui est censé aider à gérer les connexions des utilisateurs, mais cela semble plutôt inutile. (Voir Why don't people use <CFLOGIN>?)
Votre désir d'éviter de devoir "demander à chaque fois" n'est pas vraiment satisfait, mais le "demander" est minime. Le client envoie les cookies dans chaque requête ajax, ce qui "demande" effectivement que la session se poursuive. Et il doit vérifier chaque réponse ajax pour l'erreur "session timeout". Et sur le serveur, chaque fonction de traitement des requêtes doit commencer par vérifier l'existence d'une variable de session.
Mais vous pouvez utiliser un wrapper ajax sur le client pour soulager la douleur.
Sur le serveur, vous pouvez utiliser un onRequestStart
pour fournir un «pré-contrôle» commun à toutes les demandes, de sorte que vous n'avez même pas besoin de if(...no user...) { return "OH NO"; }
en haut de chaque fonction.
Je sais plus sur le côté coldfusion que sur le côté angulaire (comme dans, je n'ai même jamais regardé angulaire). Essayer de comprendre le problème cependant ... toutes vos demandes d'ajax sont au serveur de coldfusion, droit? Donc, vous commencez toutes les fonctions cfc accessibles à distance avec 'if (! IsDefined (" session.user ")) return {un objet que votre client reconnaîtra comme un timeout de session};' et lorsque le client reçoit cet objet en réponse, il définit son propre état interne sur "non authentifié" .Pourquoi cela ne fonctionne-t-il pas? –
Ok - c'est logique, mais comment définir "session.user" à définir? Je ne sais pas très bien comment faire pour créer une session ColdFusion quand je n'utilise aucun fichier .CFM ... Honnêtement, je ne sais pas. t même savoir si ColdFusion * peut * faire cela La documentation pour Application.cfc est très peu claire sur ce front Et ColdFusion ne crée-t-il pas de cookies dans le navigateur quand il crée une session? N'aurais-je pas besoin de manipuler ces Comment puis-je faire en sorte que mon appli Angular 4 accède aux cookies de ColdFusion, ou est-ce que je dois la faire faire? Je vous remercie de votre réponse –
documenta tion laisse beaucoup de choses floues. Je vais essayer de tracer le flux de base de la gestion de session dans une réponse ... –