Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果使用struts2拦截器在浏览器中打开新选项卡,则终止用户会话_Java_Jsp_Session_Struts2 - Fatal编程技术网

Java 如果使用struts2拦截器在浏览器中打开新选项卡,则终止用户会话

Java 如果使用struts2拦截器在浏览器中打开新选项卡,则终止用户会话,java,jsp,session,struts2,Java,Jsp,Session,Struts2,我的申请表是struts2 我需要在会话中存储我的应用程序详细信息。我无法从会话中删除这些属性。登录后,我必须选择要处理的对象。现在,我打开一个新选项卡并选择另一个对象进行工作。因此,我的第一个对象值被过度写入。因此,如果在我的第一个选项卡中我做了一些错误的工作,则会更新该操作的信息 这就是我计划解决这个问题的方式 我试图在拦截器类中的setter方法中设置一个值,但无法在index.jsp中访问该值 对所有操作调用此拦截器,并且index.jsp也包含在每个jsp中 我将维护一个哈希表,它将存

我的申请表是struts2

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

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

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

对所有操作调用此拦截器,并且index.jsp也包含在每个jsp中

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

如果我发现该值匹配,那么我将生成另一个值并存储在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>

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

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

希望这有帮助

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

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