Ограничение по количеству открытых вкладок
На сайте есть несколько ссылок.
При щелчке правой кнопкой мыши есть опция "открыть ссылку в новой вкладке" (опция браузера).
Я хочу ограничить пользователя, чтобы он не открывал более двух вкладок? Как я могу это сделать?
<%@ 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>
1 ответ
Вы не можете запретить пользователю открывать новую вкладку.
(Это напоминает мне старые всплывающие окна без кнопок, без адресной строки, но все еще отвечающие на возврат и другие события)
Однако вы можете заставить свое приложение распознавать попытку открытия третьей вкладки и загружать другой результат, например сообщение об ошибке, например:
Достигнуто максимальное количество открытых вкладок. Пожалуйста, используйте не более двух вкладок одновременно. закрыть эту вкладку
Для этого вы можете использовать HTML5 sessionStorage.
Примечание: веб-хранилище ( sessionStorage
а также localStorage
) поддерживается в каждом браузере.
sessionStorage
Это глобальный объект (
sessionStorage
), которая поддерживает область хранения, доступную на время сеанса страницы. Сеанс страницы длится до тех пор, пока браузер открыт и выживает после перезагрузки и восстановления страницы. Открытие страницы в новой вкладке или окне приведет к началу нового сеанса.
Тогда ты можешь
если отсутствует в sessionStorage, создайте уникальный токен в JSP и поместите его в 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); }
отправить его обратно на мероприятие
// 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'); });
, может быть установщику в BaseAction, расширяться другими действиями и читать
prepare()
или намного лучше в перехватчике;поместите его в коллекцию, проверяя, что он не содержит уже двух элементов, в противном случае возвращает результат ошибки, который должен отображаться глобально:
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(); } }
Затем вы должны найти способ распознать закрытие вкладки (чтобы освободить один слот), либо:
- ограничить срок действия элементов в вашей коллекции (если вы не используете вкладку в течение некоторого времени, сеанс истекает, и поэтому должен делать токен в коллекции)
- в противном случае, добавление таймера AJAX на вашей странице (например, каждые 30 секунд), который отправляет
keep-alive
сигнал к действию, чтобы обновить действительность элемента. Если вкладка закрывается, сигнал больше не отправляется.