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

时间:2010-10-15 11:04:28

标签: java jsf browser tabs window

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

3 个答案:

答案 0 :(得分:3)

我同意接受的解决方案,但是如果你仍然必须这样做,这些步骤对我有用(伪代码/伪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)

答案 1 :(得分:2)

  

@BalusC问题涉及完全有状态的旧JSF应用程序。为什么试图找出一些方法通知用户在两个单独的选项卡中打开应用程序是有潜在危险的。我们决不会更改会话管理的bean来请求托管bean。

使所有这些bean请求作用域,安装Tomahawk,为每个bean添加<t:saveState value="#{bean}" />到您希望在后续请求中保留完全相同的bean状态的每个视图。这在标签/窗口之间独立工作。

如果没有Tomahawk,替代方法是为您希望在后续请求中保留的每个bean属性添加<h:inputHidden />。但是我可以想象,当有很多或者它们不属于标准EL类型(因此你创建了Converter时)时,这可能会产生令人讨厌的样板代码。但这就是你得到的报酬。

答案 2 :(得分:0)

我想到的一个场景: 在页面中放置一个javascript组件,它将通过AJAX不断向服务器发送心跳。只要浏览器发送了心跳,该页面就会被标记为“current_viewing”。只要页面上有该标记,就应拒绝对该页面的其他请求。

细节可能比这个简单的故事要麻烦得多(例如,您可能需要使用心跳发送某种“页面ID”),但您明白了(...我希望:)。

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