限制打开的标签数量 [英] Restriction on number of opened tabs

查看:168
本文介绍了限制打开的标签数量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

网页上有一些链接。

点击右键,可以选择在新标签页中打开链接(浏览器选项)。

On right click there is option of 'open link in new tab'(browser option).

我想限制用户不要打开两个标签?
我该怎么做?

I want to restrict user for not opening more that two tabs? How can i do this?

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


推荐答案

您不能从限制用户打开一个新选项卡。

(这让我想起没有按钮,没有地址栏,但仍然响应退格和其他事件的旧弹出窗口)

You can't restrict the user from opening a new tab.
(This reminds me the old pop-ups with no buttons, no address bar, but still responding to backspace and other events)

然而,您可以让您的应用识别打开第三个标签的尝试,并加载不同的结果,例如错误消息,例如:

You can however make your app recognize the attempt of opening a third tab, and load a different result like an error message, for example:


达到最大打开标签限制。请同时使用不超过两个选项卡。 关闭此标签

为此,您可以使用 HTML5 sessionStorage

注意:网络存储 sessionStorage localStorage

To do this, you can use HTML5 sessionStorage.
Note: Web Storage (sessionStorage and localStorage) is supported on every browser nowadays.


sessionStorage



这是一个全局对象( sessionStorage 维护一个在页面会话期间可用的存储区域
。只要浏览器处于打开状态,页面会话
就会持续,并且会在页面
重新加载和恢复后继续存在。 在新标签页或新窗口中打开页面将导致
a新会话启动

sessionStorage

This is a global object (sessionStorage) that maintains a storage area that's available for the duration of the page session. A page session lasts for as long as the browser is open and survives over page reloads and restores. Opening a page in a new tab or window will cause a new session to be initiated.

然后你可以


  • 如果在sessionStorage中不存在,在JSP中生成一个唯一的令牌,并把它放在sessionStorage中,

  • if not present in sessionStorage, generate an unique token in JSP, and put it in 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);
    }


  • 将其发回行动

  • send it back to the action

        // 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,其他操作的extendend,以及<$ c读取$ c> prepare(),或在拦截器中好多了;

    , maybe to a setter in a BaseAction, extendend by the other actions, and read by prepare(), or much better in an Interceptor;

    将它放入集合检查它不包含两个元素,否则返回错误结果,应该全局映射:

    put it in a collection checking that it doesn't contain already two elements, otherwise return the error result, that should be mapped globally:

    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();
        }
    }
    


  • 然后你应该找到一种方法来识别标签何时关闭(释放一个广告位),或者:

    Then you should find a way to recognize when a tab get closed (to free one slot), by either:


    • 优化集合中元素的有效期(如果您暂时不使用标签,则会话过期,等等必须在集合中执行令牌)

    • 否则,放置 javascript AJAX计时器在您的页面中(例如,每30秒),将 keep-alive 信号发送到动作以刷新元素的有效性。如果标签关闭,则不再发送信号。

    • timizing the period of validity of the elements in your collection (if you don't use a tab for some time, the session expires, and so must do the token in the collection)
    • otherwise, putting a javascript AJAX timer in your page (eg. every 30 seconds), that send a keep-alive signal to an action to refresh the validity of the element. If the tab get closed, the signal is not sent anymore.

    这篇关于限制打开的标签数量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆