tab open new form _blank javascript jsp web struts2 browser-tab

javascript - open - Restricción en el número de pestañas abiertas



input target_blank (1)

No puede restringir que el usuario abra una pestaña nueva.
(Esto me recuerda las ventanas emergentes antiguas sin botones, sin barra de direcciones, pero que aún responden al retroceso y a otros eventos)

Sin embargo, puede hacer que su aplicación reconozca el intento de abrir una tercera pestaña y cargar un resultado diferente, como un mensaje de error, por ejemplo:

Límite máximo de pestañas abiertas alcanzado. Por favor, no use más de dos pestañas al mismo tiempo. cierra esta pestaña

Para hacer esto, puede usar HTML5 sessionStorage .
Nota: El almacenamiento web ( sessionStorage y localStorage ) es compatible con todos los navegadores de hoy en día.

sessionStorage

Este es un objeto global ( sessionStorage ) que mantiene un área de almacenamiento disponible durante la sesión de la página . Una sesión de página dura todo el tiempo que el navegador está abierto y sobrevive durante las recargas y restauraciones de la página. Abrir una página en una nueva pestaña o ventana provocará que se inicie una nueva sesión .

Entonces tú puedes

  • si no está presente en sessionStorage, genere un token único en JSP y póngalo en sessionStorage,

    $(function(){ // Read the ID. If it''s null, this is a new tab: // generate the ID and store it for later. var tabId = sessionStorage.getItem("tabId"); if (tabId == null){ tabId = Math.random(); sessionStorage.putItem("tabId",tabId); }

  • enviarlo de vuelta a la acción

    // Add the ID to the form (as hidden field), // so it will be posted back in next submission. $(''<input>'').attr(''type'' , ''hidden'') .attr(''name'' , ''tabId'') .attr(''value'' , tabId) .appendTo(''form''); });

    , tal vez a un setter en una BaseAction, junto con otras acciones, y read por prepare() , o mucho mejor en un Interceptor ;

  • póngalo en una colección comprobando que no contiene ya dos elementos; de lo contrario, devuelva el resultado del error, que debe mapearse globalmente:

    public String intercept(ActionInvocation actionInvocation) throws Exception { Action action = (Action) actionInvocation.getAction(); if(action instanceof LimitedTabsAware){ //interface to identify special actions ActionContext context = actionInvocation.getInvocationContext(); Map<String, String[]> request = ((HttpServletRequest) context.get(StrutsStatics.HTTP_REQUEST)).getParameterMap(); if (request.containsKey("tabId")){ String tabId = (String) request.get("tabId")[0]; List<String> openTabs = context.getSession().get("OPEN_TABS_KEY"); if (openTabs.contains(tabId)){ return actionInvocation.invoke(); } else if (openTabs.size()>=2){ return "tabLimitExceeded"; // global result } else { openTabs.add(tabId); context.getSession().put("OPEN_TABS_KEY", openTabs); return actionInvocation.invoke(); } } else { throw new IllegalArgumentException("There is no tabId in this request."); } } else { return actionInvocation.invoke(); } }

Luego deberías encontrar una forma de reconocer cuándo se cierra una pestaña (para liberar una ranura), ya sea por:

  • temporizando el período de validez de los elementos en su colección (si no usa una pestaña por algún tiempo, la sesión expira, y así debe hacer el token en la colección)
  • de lo contrario, poner un temporizador javascript AJAX en su página (por ejemplo, cada 30 segundos), que envíe una señal de keep-alive a una acción para actualizar la validez del elemento. Si la pestaña se cierra, la señal ya no se envía.

Hay algunos enlaces en la página web.

Al hacer clic con el botón derecho, hay una opción de "abrir enlace en una pestaña nueva" (opción de navegador).

Quiero restringir al usuario por no abrir más de dos pestañas? ¿Cómo puedo hacer esto?

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <ul> <li><a href="http://localhost:8080/struts_tab/abcForm1.action" oncontextmenu="return false;"><span>First Click[Right Click disabled]</span></a></li> <li><a href="http://localhost:8080/struts_tab/defForm2.action"><span>Second clieck[Not more than 2 tabs]</span></a></li> </ul> </body> </html>