En JavaScript, ¿cómo puedo identificar de forma única una ventana del navegador de otro que están bajo la misma sessionId cookiedbased

StackOverflow https://stackoverflow.com/questions/864942

  •  21-08-2019
  •  | 
  •  

Pregunta

Los usuarios de mi aplicación web pueden tener más de una ventana del navegador abierta y se refirió a la misma página. Me gustaría que el estado de ciertas cosas en la página (cargado a través de AJAX) para ser retenido a través de las devoluciones de datos. ya sea que puedo almacenar en una cookie o en mi servidor. De cualquier manera, no puedo pensar en cómo puedo distinguir cada ventana.

Por ejemplo, digamos que el usuario Bob tiene dos ventanas abiertas del navegador a la página de ListOfSomething. Cada lista tiene un LoadedPageNumber de atributo que necesito para persistir. De lo contrario los usuarios siempre terminan en la página 1 al actualizar. Bob podría haber cargado ventana del navegador 1 y apuntó a la página 5 y luego cargado ventana del navegador 2 y la apuntó a la página 14. Si tan sólo almacenar el atributo basado en ID de sesión, Bob obtendrá la página 14 en la ventana 1 si refresca.

Tenga en cuenta que mis variables de estado son en realidad mucho más compleja que este sencillo ejemplo y mi incapacidad para persistir ellos podría llevar a grandes problemas (debilidades en mi aplicación).

Necesito algún tipo de identificación ventana del navegador o algo así. Es, por supuesto, tiene que ser una solución multi-navegador (IE6 +, Wekbit? +, FF2 +)

¿Alguna idea?

Nota sobre la relevancia: Tenga en cuenta que esto es útil también para el caso en el que va a mezclar formas más antiguas basadas páginas con nuevos elementos AJAX. A veces es necesario la devolución de datos las formas y no quiere perder algunos valores de estado del lado del cliente.

¿Fue útil?

Solución

puede configurar su propio nombre de la ventana, la sintaxis exacta se me escapa en este momento, pero se puede utilizar el tiempo y la sesión actual ID para crear un identificador único de la carga de la ventana, a continuación, utilizar ese id

Esto se haría de la misma manera se establece un nombre en el método window.open () JavaScript función, (pero se puede hacer a uno mismo, en lugar de una nueva ventana)

googling espectáculos:

self.window.name = myclass.getUniqueWindowId (thisSession);

ACTUALIZACIÓN

En cuanto a su necesidad de ahorrar de esta actualización para actualizar, yo hice algunas pruebas y se ve para salvarlo de actualización para actualizar. Usando Firefox 3, en la carga inicial, el nombre de la ventana está en blanco, y presionando CTRL + R y otra vez, y el nombre de la ventana estaba poblada. i luego comento a cabo el ajuste de código el nombre y vuelve a cargar y que todavía conservaba el nombre.

<script type="text/javascript">

    alert( self.window.name );

    self.window.name = "blah";

</script>

ACTUALIZACIÓN

Tengo que hacer notar a continuación el comentario sobre el plugin de jQuery 'jquery-sesión', lo que realmente funciona y ofrece mucho más de lo que se discute aquí.

Aunque , también hay que dejar claro que depende de almacenamiento Web de HTML5, No soportado por edad avanzada es decir, versiones.

corporativa sigue dependiendo en gran medida de IE 7 ( 'y por debajo' aquí en Brasil).

Sobre la base de self.window.name, la solución para todo, no conforme a HTML5, que ofrecerá el siguiente fragmento de código como una solución multi-navegador:

<script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script>
<script language="javascript" type="text/jscript">
    //----------------------------------------------------------------------
    //-- guarantees that window.name is a GUID, and that it would
    //-- be preserved whilst this window's life cicle
    //----------------------------------------------------------------------
    //-- window.name will be set to "GUID-<SOME_RANDOM_GUID>"
    //----------------------------------------------------------------------

    $(window).load(
        function () {
            //----------------------
            var GUID = function () {
                //------------------
                var S4 = function () {
                    return(
                            Math.floor(
                                    Math.random() * 0x10000 /* 65536 */
                                ).toString(16)
                        );
                };
                //------------------

                return (
                        S4() + S4() + "-" +
                        S4() + "-" +
                        S4() + "-" +
                        S4() + "-" +
                        S4() + S4() + S4()
                    );
            };
            //----------------------

            if (!window.name.match(/^GUID-/)) {
                window.name = "GUID-" + GUID();
            }
        }
    ) //--------------------------------------------------------------------
</script>

He encontrado la función GUID aquí (para lo cual he propuesto un código de limpieza).

Otros consejos

¿Qué hay de tener su servidor de generar aleatoriamente un ID y han almacenado en la página (alguna variable javascript) cuando se sirve? A continuación, basta con incluir ese ID en la solicitud de ajax. No lo puedo' ayuda en una actualización del navegador, pero siempre y cuando el usuario abandona la página en su sitio (y simplemente deja las cosas ajax haga su trabajo) que debería funcionar bien.

Es hace mucho tiempo, pero la respuesta de Roy Rico me ayudó hoy, así que quiero compartir mi experiencia. Para manejar usos actualización de la página y la página BackButton, lo estoy haciendo así:

  • El servidor comprueba si el navegador envía el GUID con su solicitud (sólo funciona con el Ajax o el formulario de envío)
  • Si no está allí (actualizar el navegador, BackButton) sólo devuelve una página con un pequeño script JavaScript. Este script crea el GUID y la pone en el almacenamiento window.name como se describió anteriormente. Después de que la secuencia de comandos crea un formulario con el GUID como campo oculto y lo envía al servidor. El atributo de acción utiliza la misma URL que antes (window.location.href)

-> Ahora el servidor reconoce el GUID y puede entregar el contenido según sea necesario

.

Aquí está mi código (el GUID se crea en el servidor por razones de seguridad, la sintaxis "$ {GUID} es de FreeMarker y simplemente inserta el GUID del servidor):

<script>
    $(window).load(
        function () {
            if (!window.name.match(/^GUID-/)) {
                window.name = "GUID-" + "${gUid}";
            }
            $('<form action='+window.location.href+' method="POST"><input type="hidden" name="X-GUID" id="X-GUID" value='+window.name+'></form>').appendTo('body').submit();
        }
    );  
</script>

Espero que ayude a alguien

Por cierto, esta técnica sólo debe utilizarse en "NO SEO PÁGINAS", debido a la necesidad de JavaScript para obtener el contenido. Pero en general, SEO páginas no tienen necesidad de identificar la sesión pestaña.

Por supuesto, hoy en día se puede hacer uso del almacenamiento de las sesiones de HTML5, pero no quiere depender de eso, porque yo también necesito navegador más antiguo que funciona bien.

window.name se puede sobrescribir con JavaScript personalizado bibliotecas, datetimepickers etc.

En lugar de window.name sugiero que use la cabeza etiqueta meta DOM para almacenar su id

<html><head><meta id="windowID" content="{YOUR ID}">

Una vez que se ha cargado la página, tiene que cargar todo a través de AJAX en esa ventana, a continuación, puede adjuntar este ID para cada petición como un valor de la cabecera (o datos). Por ejemplo, en JQuery con este código:

$(document)
    .ajaxSend(function(event, jqXHR, ajaxOptions) {
        jqXHR.setRequestHeader('windowID',
            document.getElementById('windowID').content);
})

Para utilizar esta solución, usted tiene que tener acceso a los valores de cabecera personalizada en el lado del servidor. Por ejemplo, en servlet de Java:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String windowName = request.getHeader("windowID");

Si almacena paginación, clasificación, filtrado de información, etc en el lado del servidor como atributo de sesión, debe almacenarlos fijados por separado a la ventana separada ID-s.

Puede utilizar HTML5 sesión de almacenamiento, simplemente generar un identificador único y la puso en el almacenamiento de las sesiones! lo que es bueno de que cada ventana o pestaña tiene su propio almacenamiento de sesión. por ejemplo:

Si corremos el siguiente en 3 ventanas:

ventana 1: sessionStorage.setItem('key' , 'window1');

Ventana 2: sessionStorage.setItem('key' , 'window2');

ventana 3: sessionStorage.setItem('key' , 'window3');

sessionStorage.getItem('key' ); <<< esto devolverá el valor correspondiente en la ventana!

ventana 1: sessionStorage.getItem('key'); rendimientos ventana 1

Ventana 2: <=> rendimientos ventana 2

ventana 3: <=> rendimientos ventana 3

Creo que está intentando guardar una variable (por separado en cada pestaña / ventana).

sessionStorage trabaja como encanto.

El único problema que se puede encontrar que el navegador debe apoyar HTML 5.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top