2010-06-07 4 views
3

Je pense que je pourrais malentendre quelque chose au sujet des sessions Rails, alors s'il vous plaît gardez-moi, je ne formulerais peut-être pas ma question de la meilleure façon.Ma session Rails est réinitialisée lorsque j'ai des demandes simultanées

Je travaille sur une application iPhone avec un backend Ruby on Rails. J'ai une vue web qui par défaut va à l'action d'index d'un contrôleur (et utilise des sessions), et en arrière-plan un tas d'appels d'API allant à un contrôleur différent (et qui n'ont pas besoin d'utiliser des sessions).

Le problème est que les sessions définies par ma vue Web semblent être surpassées par les appels d'API. Mon serveur de mise en scène est assez lent, donc il y a beaucoup de temps pour les demandes de se chevauchent - ce que je vois dans les journaux est essentiellement ceci:

Request A (first controller) starts. Session is empty. 
Request B (second controller) starts. Session is empty. 
Request A finishes. Request A has done authentication, and stored the user ID in the session. Session contains user ID. 
Request B finishes. Session is empty. 
Request C starts. Session is empty - not what I want. 

Maintenant, la chose étrange est que la demande B ne doit pas être écrit quoi que ce soit à la session.

Je n'ai avant et après les filtres qui se lit de la session - des choses comme:

user = User.find_by_id(session[:id]) 

ou

logger.debug session.inspect 

et si je retire tous ceux-ci, alors tout fonctionne comme prévu - la session Le contenu est défini par la requête A, et ils sont toujours présents lorsque la requête C démarre.

Donc. Je pense qu'il me manque quelque chose sur le fonctionnement des sessions. Pourquoi la lecture de la session l'écraserait-elle? Dois-je y accéder d'une autre manière? Suis-je complètement sur la mauvaise piste et le problème est ailleurs?

Merci pour vos commentaires!

+0

La même chose m'arrive aussi. Avez-vous trouvé une solution pour cela? – jumpa

Répondre

4

Ceci est le résultat d'une condition de concurrence causée par la façon dont les rails gèrent la session. Voir http://www.paulbutcher.com/2007/05/race-conditions-in-rails-sessions-and-how-to-fix-them/

Il semble que vous ne pouvez pas avoir de requêtes simultanées modifiant la session de manière fiable. La solution consiste à utiliser une méthode différente de stockage de session (par exemple, active_record ou redis) ou vous pouvez éliminer les demandes simultanées.

+0

J'ai évolué depuis et ne travaille plus sur ce projet - aucune idée si le problème s'applique toujours aux dernières versions de Rails - mais j'accepte cette réponse :) –

-1

Il est possible que cela soit dû au fait que vous stockez l'ID utilisateur en tant que ": id" dans l'objet de session. : id peut être une clé réservée dans l'objet. Essayez d'utiliser un nom différent tel que session [: user_id].

Bonne chance!

1

Vos sessions sont peut-être basées sur des cookies. Si c'est le cas, chaque requête commence par le même cookie (session). Le cookie contient le contenu de la session. Essayez de basculer le stockage sur le serveur. Mais je dans votre cas avec l'authentification je pense qu'il serait préférable de ne pas faire cela asynchrone.

Request A (first controller) starts. Session is empty. 
Request B (second controller) starts. Session is empty. 
Request A finishes. Request A has done authentication, and stored the user ID in the session. Session contains user ID 
    .....AND returning the session content in a cookie. 
Request B finishes. Session is empty. 
    THIS one is setting blank session. 
Request C starts. Session is empty - not what I want. 
    Thats because B has set reset the session 
Questions connexes