如何阻止用户在 XPages 中打开新的浏览器会话

2023-12-19

我有一个前端文档锁定过程,它创建一个包含 UNID/用户名/时间的应用程序范围变量,然后是一个每 30 秒更新此信息的计时器。如果有人尝试打开文档进行编辑,我会检查(使用 UNID)看看其他人是否拥有该文档。如果时间大于 30 秒,我会取消锁定并允许新用户打开它。

我考虑过用数据库“锁”做类似的事情,这非常简单,但我需要浏览器会话的唯一标识符。我可以使用 ReplicaID/UserName/time 构建 applicationScope 变量,但我需要另一条信息来标识此浏览器会话。

某处有这样的信息吗?像浏览器sessionID之类的东西?


你只想允许one打开浏览器窗口/选项卡user and database.

对于在浏览器中打开的每个 XPage,您必须测试是否已在另一个浏览器窗口/选项卡中打开相同的数据库。如果是这样,请拒绝使用以下命令打开 XPage:重定向到错误 XPage。

仅在服务器端不可能执行此操作,因为服务器不知道 Xpage 在哪个浏览器选项卡中打开。

因此,服务器需要客户端的帮助。客户端必须给服务器一个unique浏览器窗口/选项卡 ID.

浏览器窗口/选项卡没有唯一的 ID。但是,打开一个新窗口/选项卡我们可以创建一个随机编号并将其存储在浏览器中会话存储 http://www.nczonline.net/blog/2009/07/21/introduction-to-sessionstorage/。这是一个独特的存储空间every窗口/选项卡。

This 窗口/选项卡 ID可以通过部分刷新 GET 发送到服务器,并以应用程序范围变量的形式存储在服务器上供用户使用。

此外,服务器必须知道窗口/选项卡何时关闭,以便可以在另一个窗口/选项卡中打开相同的数据库。为此,客户端必须每隔 X 秒告诉服务器“我还活着”。

这是完整的解决方案:

创建自定义控件“UniqueBrowserTab”

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
    <xp:eventHandler
        event="onClientLoad"
        submit="false">
        <xp:this.script><![CDATA[
            var secondsIamAliveInterval = 5;
            var tabId = sessionStorage.getItem("tabId");
            if (!tabId) {
                tabId = Math.random();
                sessionStorage.setItem("tabId", tabId);
            }
            function sendTabIdToServer() {
                XSP.partialRefreshGet("#{id:browserTabControl}", {
                    params: {'tabId': tabId}
                });
            }
            sendTabIdToServer();
            setInterval(function() {
                sendTabIdToServer();
            }, secondsIamAliveInterval * 1000);
        ]]></xp:this.script>
    </xp:eventHandler>
    <xp:panel id="browserTabControl">
        <xp:this.rendered><![CDATA[#{javascript:
            var secondsIgnoreOtherSession = 7;
            if (param.tabId) {
                var userName = session.getEffectiveUserName();
                var userData = applicationScope.get(userName);
                var now = new Date().getTime();
                if (userData) {
                    if (userData.tabId !== param.tabId) {
                        if (userData.time + secondsIgnoreOtherSession*1000 > now) {
                            context.redirectToPage("Error.xsp");
                        }
                    }
                } 
                applicationScope.put(userName, {tabId : param.tabId, time: now});
            }
            return true
        }]]></xp:this.rendered>
    </xp:panel>
</xp:view>

将自定义控件“UniqueBrowserTab”包含到每个 XPage 中,或者例如进入应用程序布局的自定义控件。

<?xml version="1.0" encoding="UTF-8"?>
<xp:view
    xmlns:xp="http://www.ibm.com/xsp/core"
    xmlns:xc="http://www.ibm.com/xsp/custom">
    <xc:UniqueBrowserTab />
    ...
</xp:view>

创建一个 Page Error.xsp,其中包含not包括自定义控件“UniqueBrowserTab”。

这将只允许用户在所有浏览器上为每个数据库使用一个浏览器窗口/选项卡。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何阻止用户在 XPages 中打开新的浏览器会话 的相关文章

随机推荐

  • 删除溢出的内联元素行之间的边距

    我正在创建一个基于图块的游戏 并使用块渲染来更新大量图块 我试图以最简单的方式做到这一点 所以我一直在尝试使用 HTML 的默认布局 现在我正在创建 内联块 省略元素之间的空白以避免它们之间的水平空间 但是当块溢出并创建新行时 会有一些垂直
  • 如何在 Swift 中更改 UIBezierPath 的颜色?

    我有一个实例UIBezierPath我想将描边的颜色更改为黑色以外的颜色 有谁知道如何在 Swift 中做到这一点 有了 Swift 5 UIColor has a setStroke https developer apple com d
  • 过滤 Chrome 控制台消息

    有没有办法在 Chrome 控制台中过滤消息 例如 我不想看到来自 包含 JQMIGRATE 的消息 您可以通过在前面添加来否定过滤器 例如 JQMIGRATE将排除包含字符串 JQMIGRATE 的消息 正则表达式过滤器也可以通过这种方式
  • 自动装配依赖项注入失败

    我在 Java EE 应用程序中使用 Spring 和 Hibernate 该项目托管于这个 GitHub 存储库 http github com whirlwin niths 我通过服务使用 Autowired 时遇到问题 如下所示 pa
  • Django 信号 - kwargs['update_fields'] 在通过 django admin 进行模型更新时始终为 None

    我的 django 应用程序中有一个信号 我想检查模型中的某个字段是否已更新 以便我可以继续执行某些操作 我的模型看起来像这样 class Product models Model name models CharField max len
  • Auth::attempt() 在 Laravel 5.5 中不起作用

    我的注册表单正在运行 它将用户存储到数据库 但是当用户登录时 Auth attempt 返回 false 这是我的登录代码 我将密码以 sha1 加密形式存储在 db 中 Route post login function creds ar
  • 将 Pip 包传输到 conda

    我目前正在使用一台共享的 Ubuntu 机器 其中有蟒蛇2 7以及通过安装的多个软件包pip python version Python 2 7 12 pip version pip 18 0 from usr local lib pyth
  • 验证十进制数

    我正在阅读一些 csv 文件 其中包含表示十进制数的字符串 我的麻烦是 很多时候我接收使用不同区域设置的文件写入 例如 file1 csv的price列的值为129 13 是小数点分隔符 file1 csv的price列值为129 13 为
  • 如何计算密码学中的对数?

    我正在尝试对字节执行非线性函数来实现 SAFER 该算法需要计算字节的以 45 为底的对数 我不明白如何做到这一点 log45 201 1 39316393 当我将其分配给一个字节时 该值被截断为 1 并且我无法恢复确切的结果 我该怎么处理
  • 为什么这段 Javascript 代码这么慢?

    我有这段 Javascript 代码 在 Internet Explorer 中每次调用大约需要 600 毫秒 在其他浏览器中花费的时间可以忽略不计 var nvs currentTab var nvs zoomfield var nvs
  • 异步目录搜索器 (LDAP)

    我正在活动目录中执行长时间搜索 并且非常想使用 DirectorySearcher Asynchronous True 微软提供的文档很少MSDN http msdn microsoft com en us library system d
  • PHP 类:从被调用的方法访问调用实例

    很抱歉这个奇怪的话题 但我不知道如何用其他方式表达它 我正在尝试从调用类访问方法 就像这个例子一样 class normalClass public function someMethod this method shall access
  • Javascript/vue.js接收json

    我正在尝试在我的 vue js 应用程序中接收 json 如下所示 new Vue el body data role company list created function this getJson methods getJson f
  • 将对象重新放入 ConcurrentHashMap 是否会导致“发生在”内存关系?

    我正在与existing具有 ConcurrentHashMap 形式的对象存储的代码 映射内存储了可供多个线程使用的可变对象 根据设计 没有两个线程会尝试同时修改一个对象 我关心的是线程之间修改的可见性 目前 对象的代码在 setter
  • dojo multipleDefine与mapkitJS和ArcGIS esri-loader的错误

    我不知道在哪里MapkitJS and esri loader在一起有问题 从这里和其他地方的研究来看 似乎可能与另一个包存在命名冲突 这里有一个link https github com Esri esri loader issues 1
  • 在 v7 中使用 setViewCube 更新视图

    如何在 v7 中使用 setViewCube 更新视图 我在 v6 中使用了以下代码 但它在 v7 中不起作用 viewer setViewCube top front 在 v6 到 v7 的迁移指南中 它说 我应该通过扩展来调用它 ext
  • 如何在 UWP 应用中使用依赖注入?

    我在 UWP 应用程序中使用 autofac 在我的App例如 我正在设置依赖项 如下所示 public sealed partial class App private readonly IFacade m facade public A
  • 使用 AVAudioEngine 播放 AVAudioPCMBuffer 中的音频

    我有两节课MicrophoneHandler and AudioPlayer 我已经成功使用AVCaptureSession使用批准的答案窃听麦克风数据here https stackoverflow com questions 33850
  • ServiceStack 返回 JSV 而不是 JSON

    我有一个使用 ServiceStack 创建的服务 最近我更新了 ServiceStack 库 现在我收到的是 JSV 响应而不是 JSON 响应 该请求看起来像 POST http localhost api rest poll crea
  • 如何阻止用户在 XPages 中打开新的浏览器会话

    我有一个前端文档锁定过程 它创建一个包含 UNID 用户名 时间的应用程序范围变量 然后是一个每 30 秒更新此信息的计时器 如果有人尝试打开文档进行编辑 我会检查 使用 UNID 看看其他人是否拥有该文档 如果时间大于 30 秒 我会取消