您不能限制用户打开新选项卡。
(这让我想起了没有按钮,没有地址栏,但仍然响应退格和其他事件的旧弹出窗口)
但是,您可以让您的应用识别打开第三个选项卡的尝试,并加载不同的结果,例如错误消息,例如:
已达到最大打开标签限制。请同时使用不超过两个选项卡。close this tab
为此,您可以使用HTML5 sessionStorage。
注意:现在每个浏览器都支持Web Storage (sessionStorage
和localStorage
) 。
会话存储
这是一个全局对象 ( 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 中的 setter,由其他操作扩展,并由 读取prepare()
,或者在 Interceptor 中更好;
把它放在一个集合中,检查它是否已经包含两个元素,否则返回错误结果,应该全局映射:
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();
}
}
然后,您应该找到一种方法来识别选项卡何时关闭(以释放一个插槽),方法是: