2010-10-15 26 views
1

Est-il possible d'empêcher l'utilisateur d'ouvrir la page JSF dans plus d'un onglet ou d'une fenêtre du navigateur?Empêcher l'utilisateur d'ouvrir la page JSF dans plus d'un onglet/fenêtre dans un navigateur

+0

S'il vous plaît le problème Elaborer que vous pensiez que c'est le Solu plutôt que de se demander comment parvenir à une solution qui, en soi, n'est peut-être pas la bonne solution après tout. – BalusC

+0

@BalusC Le problème concerne l'ancienne application JSF qui est entièrement à état. Pourquoi essayer de trouver un moyen d'informer les utilisateurs que l'ouverture de l'application dans deux onglets distincts est potentiellement dangereuse. Nous ne pouvons en aucun cas modifier les beans gérés par session pour demander des beans gérés. – mgamer

Répondre

2

@BalusC Le problème concerne l'ancienne application JSF entièrement active. Pourquoi essayer de trouver un moyen d'informer les utilisateurs que l'ouverture de l'application dans deux onglets distincts est potentiellement dangereuse. Nous ne pouvons en aucun cas modifier les beans gérés par session pour demander des beans gérés.

faire une demande tous les haricots SCOPED, installer Tomahawk, ajouter <t:saveState value="#{bean}" /> pour chaque grain à chaque point de vue dont vous souhaitez conserver le même état de haricot dans la demande ultérieure. Cela fonctionne indépendamment à travers les onglets/fenêtres.

Sans Tomahawk, l'alternative serait d'ajouter <h:inputHidden /> pour chaque propriété de bean que vous souhaitez conserver dans la requête suivante. Je peux cependant m'imaginer que cela peut produire un mauvais code quand il y en a beaucoup ou quand ils ne sont pas du type EL standard (pour lequel vous devez créer un Converter). Mais c'est ce pour quoi vous êtes payé.

+0

ou utilisez SEAM. =) http://seamframework.org/ – bungrudi

+0

Je ne voudrais pas intégrer Seam dans une application JSF existante. – BalusC

+0

C'est un conseil très utile, mais nous avons décidé de créer un cookie simple en vérifiant si la page est ouverte sur une seule page et nous affichons un avertissement approprié au cas où le deuxième onglet aurait été ouvert. – mgamer

0

Un scénario que j'ai en tête: Placez un composant javascript dans la page qui enverra constamment le rythme cardiaque au serveur via AJAX. Tant qu'il y a des pulsations envoyées par le navigateur, cette page sera signalée comme "en cours de visualisation". Et tant qu'une page est activée, les autres demandes adressées à cette page doivent être rejetées.

Le détail peut être beaucoup plus désordonné que cette histoire simple (par exemple, vous devrez peut-être avoir une sorte de 'page id' à envoyer avec le rythme cardiaque), mais vous obtenez l'idée (... j'espère :) .

Tout est possible tant que vous êtes prêt à payer le prix.

1

Je suis d'accord avec la solution acceptée, mais si vous avez encore de le faire, ces étapes a fonctionné pour moi (pseudo code/pseudo python):

Du côté JS:

if tabId not set: 
    . generate random number 
    . set property in sessionStorage 
otherwise: 
    . get it from sessionStorage 
make an ajax callback and send tabId 
onError: 
    . alert(); 
    . close current tab (if possible); 
    . logout 

Backend: (JSF):

Create custom filter: 
    if request contains the tabId info: 
    if it matches session's tabId: (being tabId not null) 
     sent response status code to an error such as forbidden 
     Optionally invalidate session 
    otherwise apply session filtering (do nothing)