En javascript, ¿cómo puedo identificar una ventana del navegador de otro, que están bajo el mismo cookiedbased sessionId


Los usuarios de mi aplicación web pueden tener más de una ventana del navegador abierta y apuntando a la misma página. Me gustaría que el estado de ciertas cosas en la página (cargado a través de ajax) se mantenga a través de postbacks. 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 del navegador abiertas a la página ListOfSomething. Cada lista tiene un atributo LoadedPageNumber que necesito persistir. De lo contrario, los usuarios siempre terminan en la página 1 cuando se actualizan. Bob podría haber cargado la ventana del navegador 1 y señalarla a la página 5 y luego cargar la ventana del navegador 2 y señalarla a la página 14. Si solo almaceno el atributo basado en el id de sesión, Bob obtendrá la página 14 en la ventana 1 si lo actualiza.

Tenga en cuenta que mis variables de estado son en realidad mucho más complejas que este simple ejemplo y mi incapacidad para persistirlas podría conducir a grandes problemas (debilidades en mi aplicación).

Necesito algún tipo de id de ventana del navegador o algo así. Por supuesto, tiene que ser una solución cross-browser (IE6+, Wekbit?+ , FF2+)

¿Alguna idea?

Nota sobre la relevancia: Tenga en cuenta que esto también es útil para el caso en el que está mezclando páginas basadas en formularios antiguos con elementos habilitados para AJAX más nuevos. A veces necesitas devolver los formularios y no quieres perder algunos valores de estado del lado del cliente.

Author: Alexis Wilke, 2009-05-14

5 answers

Puede establecer su propio nombre de ventana, la sintaxis exacta se me escapa en este momento, pero puede usar la hora actual y el id de sesión para crear un id único en la carga de la ventana, luego use ese id

Esto se haría de la misma manera que se establece un nombre en la ventana de javascript.función open (), (pero puede hacerlo a sí mismo, en lugar de nueva ventana)

Buscando en Google muestra:

Self.window.name = myclass.getUniqueWindowId (esta sesión );

ACTUALIZAR

Con respecto a su necesidad de guardar esto de refresco a refresco, hice algunas pruebas y parece guardarlo de refresco a refresco. Usando Firefox 3, en la carga inicial, el nombre de la ventana está en blanco, y presionando CTRL + R una y otra vez, y el nombre de la ventana se rellenó. luego comenté la configuración del código de nombre y recargé y aún conservé el nombre.

<script type="text/javascript">

    alert( self.window.name );

    self.window.name = "blah";

</script>

ACTUALIZAR

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

Aunque , también se debe dejar claro que se basa en el almacenamiento web de HTML5, no es compatible con versiones anteriores de IE.

Corporativo todavía depende en gran medida de IE 7 ('y por debajo de' aquí en Brasil).

Basado en self.window.name, LA solución para todo lo que no es compatible con HTML5, ofrezco el siguiente fragmento de código como una solución de navegador cruzado:

<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>

Encontré la función GUID aquí (para lo cual propuse una limpieza de código).

 36
Author: Roy Rico,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:07

¿Qué tal si su servidor genera aleatoriamente un ID y lo almacena en la página (alguna variable javascript) cuando se sirve? Luego solo incluye ese ID en la solicitud ajax. No ayudará en una actualización del navegador, pero siempre y cuando el usuario deje esa página en su lugar (y solo deje que las cosas de ajax hagan lo suyo) debería funcionar bien.

 1
Author: Herms,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-14 18:36:14

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

  • Su servidor comprueba si el navegador envía el GUID con su solicitud (solo funciona con ajax o form submit)
  • Si no está allí (actualización del navegador, botón de retroceso) simplemente envía una página con un pequeño script JavaScript. Este script crea el GUID y lo pone en el window.name almacenamiento como descrito anteriormente. Después de eso, el script crea un formulario con el GUID como campo oculto y lo envía al servidor. El atributo action utiliza la misma URL que antes (window.ubicación.href)

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

Aquí está mi código (el GUID que creo en el servidor por razones de seguridad, la sintaxis " {{gUid} es de freemarker y solo inserta el Guid desde el 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>

Esperanza que ayuda alguien

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

Por supuesto que hoy en día se puede hacer uso del almacenamiento de sesión HTML5, pero no quiero confiar en eso, porque también necesito navegador más antiguo para trabajar bien.

 1
Author: GobiRan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-07 23:14:24

Window.name puede ser sobrescrito por bibliotecas javascript personalizadas, datetimepickers, etc.

En lugar de window.name Le sugiero que utilice la meta etiqueta DOM head para almacenar su id

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

Después de cargar la página, debe cargar todo a través de ajax en esa ventana, luego puede adjuntar este ID a cada solicitud como un valor de encabezado (o datos). Por ejemplo en jQuery con este código:

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

Para usar esta solución, debe tener acceso a valores de encabezado personalizados en el lado del servidor. Para ejemplo en Java servlet:

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

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

 0
Author: Attila,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-13 09:34:59

Puede usar el almacenamiento de sesión HTML5, solo genere un id único y establézcalo en el almacenamiento de sesión. lo que es genial acerca de que cada ventana o pestaña tiene su propio almacenamiento de sesión. por ejemplo :

Si ejecutamos lo 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' );

Ventana 1: sessionStorage.getItem('key' ); devuelve la ventana 1

Ventana 2: sessionStorage.getItem('key' ); devuelve la ventana 2

Ventana 3: sessionStorage.getItem('key'); devuelve la ventana 3

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

SessionStorage funciona como encanto.

El único problema que puede enfrentar ese navegador debe soportar HTML 5.

 0
Author: Amjad Abdul-Ghani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-30 20:27:32