【问题标题】:expiring the session of user if new tab is opened in browser using struts2 interceptors如果使用 struts2 拦截器在浏览器中打开新选项卡,则用户会话到期
【发布时间】:2014-02-05 10:03:50
【问题描述】:

我的应用程序在 struts2 中。

我要求在会话中存储我的应用程序详细信息。我无法从会话中删除这些属性。登录后,我必须选择要处理的对象。现在我打开一个新选项卡并选择另一个工作对象。因此,我的第一个对象值被覆盖了。因此,如果在我的第一个选项卡中我做了一些工作,那么该操作会更新错误信息。

这就是我计划解决问题的方式。

我试图在拦截器类的 setter 方法中设置一个值,但我无法在我的 index.jsp 中访问该值。

这个拦截器被所有的action调用,index.jsp也包含在每个jsp中。

我将维护一个哈希表,该哈希表将存储用户 ID 和 40 个字符的随机字符串。这个 id 将是唯一的,在将 jsp 中存在的值与存储在 hastable 中的值进行比较后,我将更新 userid。

如果我发现该值匹配,那么我将生成另一个值并存储在 jsp 和 hastable 中。如果值不匹配,我将销毁会话。

请告知我该如何继续,或者是否有任何其他解决方法可以实现相同的目标。

代码 拦截器类

String strFrom = (String)aContext.get(ServletActionContext.ACTION_NAME);
HttpServletRequest httpReq = (HttpServletRequest)aContext.get(ServletActionContext.HTTP_REQUEST);
HttpSession session = httpReq.getSession();

String sessionValue = (String)httpReq.getSession().getAttribute("sessionValue");

String test = httpReq.getParameter("sessionValue");
if(strFrom.equals("ValidateUser")){
        // Do nothing
}else if(sessionValue == null && strFrom.equals("HomePage")){
      session.setAttribute("sessionValue", getRandomString(20));
}else if (sessionValue.equals(session.getAttribute("sessionValue"))){
      session.setAttribute("sessionValue", getRandomString(20));
}else{
            httpReq.setAttribute("message","Session Expired. Please Login Again");
            return "loginAgain";
    }

index.jsp

<body>
<s:hidden id="hidBidType" value="%{#session.tenderBidType}"/>
<s:property value="%{#session.sessionValue}"/>
<s:hidden name="sessionValue" id="sessionValue" value="%{#session.sessionValue}"/>
</body>

login.jsp

<form name="loginPage" method="post">
<s:hidden name="sessionValue" id="sessionValue" value="1"/>
</form>

【问题讨论】:

  • 如果会话过期,您必须重新创建会话对象。

标签: java jsp session struts2


【解决方案1】:

对于您随机生成的 40 个字符的值,为什么不使用时间戳?

嗯,我看不出你的方法有什么好处(但我当然可能是错的)。您仍然可以注册 SessionListener 并检查用户是否有会话,不是吗?所以,你真的需要做所有这些事情取决于你,但我不会那样做 - 所有页面的拦截器,在页面中存储值,检查是否相同......只需注册一个SessionListener 并将您的用户 ID 或其他用户的唯一值放入会话中,比较并销毁会话(或您需要的其他内容)。

希望这会有所帮助。

已编辑 我正在开发一个具有类似要求的 Web 应用程序。我们所做的(我确信这不是最佳选择)是在登录后打开没有导航栏的新窗口并关闭登录窗口。然后我们捕获窗口上的所有事件并禁用 ctrl+tab、右键单击等许多功能。在此应用程序中,用户不允许打开多个窗口。我再说一遍——这可能不是最好的选择。只是一个想法。

【讨论】:

  • 我也可以使用时间戳(谢谢)。但我担心的是,我如何知道是否打开了新选项卡并选择了新对象进行处理,并且新对象值未在前一个对象中更新。这里两个对象都只在一个用户之下。会话侦听器将无法识别这两个不同的对象,因为这两个对象都在同一个用户下,并且在同一个浏览器中打开,但在不同的选项卡下。
  • 我已经找到了一种方法来做到这一点,但我有一个问题,我无法从 index.jsp 页面获取隐藏值到拦截器类。但是,我能够从 login.jsp 中的隐藏字段中获取值。我在我的问题中添加了代码以供参考。不同之处在于,在我的 login.jsp 中,隐藏字段在表单标签内,而在 index.jsp 中没有隐藏字段。
  • 您必须向服务器发送请求才能发送值。在 index.jsp - 放置一个表单并提交,或者通过锚点中的 url 发送值。今天早上我做了一些测试——在重定向中,如果你不放一个 ActionClass,你就不会通过拦截器(这是我的情况)。如何从 index.jsp 重定向到下一页?
  • 我在每个页面上都包含 index.jsp。如果我尝试在其中创建一个表单字段,我的 javascript 将停止在许多页面上工作。 document.forms[0] 正在许多地方使用。所以我不能在jsp中创建表单标签。此外,在 index.jsp 中,如果我在创建表单字段然后隐藏值之后尝试从中获取值,我将得到 null,因为未提交此表单:(.
猜你喜欢
  • 2017-05-26
  • 1970-01-01
  • 2022-12-09
  • 1970-01-01
  • 2012-01-01
  • 2018-08-29
  • 1970-01-01
  • 2016-04-07
  • 2011-09-04
相关资源
最近更新 更多