5

C'è un modo per verificare che la mia pagina non sia aperta in un'altra scheda o finestra in IE? Supponiamo che io abbia Pagina1 e che l'utente prenda "nuova finestra", che aprirà una nuova finestra con la stessa pagina aperta. Quindi ora ci sono due istanze della pagina. Voglio limitare il browser per avere solo un'istanza della pagina aperta in un dato momento.Come rilevare che la stessa pagina è già aperta in un'altra finestra in IE

Uno dei requisiti è che gli utenti devono essere in grado di aggiornare la pagina e rimanere nello stesso stato all'interno dell'applicazione. Quindi i token una tantum non sono adatti.

Non sono sicuro che ci sia un modo per distinguere tra un aggiornamento della pagina e una nuova finestra aperta, ecco perché lo sto chiedendo.

P.S. Questo non è per un normale sito web, e capisco che farlo normalmente sarebbe intrusivo e malvagio. C'è un caso forte per fare questo qui, in quanto è una massiccia applicazione web.

+1

... e altri browser? –

+2

"Voglio limitare il browser per avere solo un'istanza della pagina aperta in un dato momento" Quale problema specifico è questo comportamento piuttosto scomodo e non intuitivo che intende indirizzare? Sicuramente c'è un modo migliore? – spender

+1

Sono d'accordo con Spender, questo sembra terribilmente invadente. C'è in realtà un numero sorprendente di persone là fuori che non capiscono abbastanza bene la navigazione a schede per sapere * se hanno già un altro aperto sulla stessa pagina: cosa faranno? –

risposta

4

Il modo migliore per implementare questo è avere un token lato server (molte banche lo fanno) che viene rigenerato ad ogni richiesta e deve essere passato indietro affinché le pagine funzionino.

Quindi, fondamentalmente:

  1. si aggiunge un token generato per ogni link (come parte della stringa di query)
  2. qualsiasi richiesta che si riceve che non contiene il token può essere considerato non valido.
  3. generare un nuovo token ad ogni richiesta in modo che solo 1 gettone è valida in qualsiasi 1 momento
+6

Ho appena aggiornato la pagina. Ops. – spender

+0

Deve gestire anche l'aggiornamento della pagina, quindi non è accettabile. –

+0

Questo ha senso se si genera un token su document.load. Stiamo inviando richieste in modo costante, quindi possiamo solo rilevare le richieste inviate dallo stesso utente, ma con 2 diversi token e rispondere con un reindirizzamento a uno di essi. –

0

L'unico modo in cui posso pensare è che ogni pagina crei un cookie che identifichi la pagina e il suo tempo di accesso, con un tempo di scadenza di pochi secondi o minuti (aggiustare a piacere), e il caricamento di il tuo sito (o caricamento della pagina) controlla se quel cookie esiste.

pseudo-codice:

if (cookie exists) { 

Page already loaded in another tab/window. 

} 

else { 

write cookie 

} 

Possiby si potrebbe usare qualche forma di ID di sessione, sulla base di qualcosa che non univoco. Forse con l'indirizzo IP dell'utente, nome utente e sale? Lo svantaggio di usare solo l'indirizzo IP è che tutti gli utenti dietro a un router condividono lo stesso indirizzo, il vantaggio di accoppiarlo con il nome utente è che è almeno unico per utente e il sale è usato per la sicurezza di base (potrebbe non essere tutto ciò importante per te, ma sembra ancora una buona pratica), e impedisce a un utente di essere bloccato perché ha "aperto un'altra finestra" da qualche parte.

Come sopra, controllare se esiste l'id di sessione e, in caso contrario, quindi crearlo.

Come notato da @Spender, nei commenti alla tua domanda e ad un'altra risposta, qualsiasi soluzione che implementa questo ha almeno il problema delle persone che non hanno il permesso di aggiornare la pagina. Che una breve durata dei cookie riduce almeno, ma non in un modo che non impedisce agli utenti di essere probabilmente irritati.


Modificato:

per far fronte alla necessità per la pagina-refresh, credo che si potrebbe utilizzare il onUnload (o di .unload jQuery) per distruggere il cookie, in modo che sia rimossa per l'utente lasciando/rinfrescare la pagina.

Il js che esegue onUnload può essere utilizzato per rimuovere anche la variabile di sessione, da Ajax, o solo il cookie sul lato client.

2

Un modo semplice per farlo è quello di utilizzare windowName

window.open(windowURL, windowName, windowFeatures); 

assegnarlo somethign unico e controllarlo quando viene fatto clic sul collegamento per assicurarsi che non sia già stato aperto.

questo ragazzo lo spiega davvero bene. - http://www.joemarini.com/tutorials/tutorialpages/window1.php

Problemi correlati