代码之家  ›  专栏  ›  技术社区  ›  mgamer

防止用户在浏览器的多个选项卡/窗口中打开JSF页面

  •  1
  • mgamer  · 技术社区  · 14 年前

    是否可以防止用户在多个浏览器选项卡或窗口中打开JSF页面?

    3 回复  |  直到 14 年前
        1
  •  2
  •   BalusC    14 年前

    @BalusC这个问题涉及到完全有状态的旧JSF应用程序。为什么要设法告诉用户在两个单独的标签页中打开应用程序是有潜在危险的。我们决不能将会话托管bean更改为请求托管bean。

    让所有这些bean请求作用域,安装 Tomahawk ,添加 <t:saveState value="#{bean}" /> 对于每个bean到每个视图,您希望在随后的请求中保留完全相同的bean状态。这在选项卡/窗口中独立工作。

    <h:inputHidden /> 对于要在后续请求中保留的每个bean属性。不过,我可以想象,当有很多或不是标准EL类型时(因此您必须为其创建 Converter ). 但这就是你得到的报酬。

        2
  •  4
  •   Felix    8 年前

    我同意接受的解决方案,但如果您仍然需要这样做,这些步骤对我有效(伪代码/伪python):

    在JS方面:

    if tabId not set:
      . generate random number 
      . set property in sessionStorage
    otherwise:
      . get it from sessionStorage
    make an ajax callback and send tabId
    onError:
      . alert(); 
      . close current tab (if possible);
      . logout
    

    后端:(JSF) :

    Create custom filter:
      if request contains the tabId info:
        if it matches session's tabId: (being tabId not null)
          sent response status code to an error such as forbidden
          Optionally invalidate session
      otherwise apply session filtering (do nothing)
    
        3
  •  0
  •   bungrudi    14 年前

    在页面中放置一个javascript组件,它将通过AJAX不断地向服务器发送心跳信号。只要有心跳信号从浏览器发送,此页将被标记为“当前正在查看”。只要一个页面上有这个标志,对该页面的其他请求就应该被拒绝。

    细节可能比这个简单的故事要复杂得多(例如,你可能需要有某种“页面id”来发送心跳),但是你得到了这个想法(。。。我希望:)。

    只要你愿意付出代价,一切皆有可能。