gpt4 book ai didi

java - jsp中跨选项卡的 session 管理

转载 作者:行者123 更新时间:2023-11-29 03:09:39 26 4
gpt4 key购买 nike

技术--Struts2 & JSP

  1. 访问网址-- http://localhost:8080/session_acroos_tab/login.action

  2. 在 Welcome.jsp 中,用户在“第一个文本字段”中输入一些值并单击“第一个按钮”。

  3. 单击此按钮(第一个按钮)时,将调用 LoginAction.java 的 firstButtonClick 函数。
  4. 现在控制将再次转移到 Welcome.jsp。在此 jsp 上显示用户在“第一个文本字段”中输入的值,
  5. 用户应在“第二个文本字段”中输入一些值,然后单击“第二个按钮”。
  6. 单击此按钮(第二个按钮)时,将调用 LoginAction.java 的 secondButtonClick 函数,控制将再次转到 Welcome.jsp 页面。

在执行第 5 步之前,如果用户打开新选项卡并从第 1 步执行到第 3 步,然后再次返回到 tab-1 并执行剩余的步骤,那么所有 session 数据都会变得困惑。我知道,所有打开的新选项卡都应共享同一个 session ,但解决方案是什么。我想独立使用这两个选项卡。

欢迎.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<head>
<title>Welcome</title>
<script type="text/javascript">
function clickSecondButton(form)
{
form.action="secondButtonClickForm2";
form.submit();
}
</script>
</head>
<s:form action="firstButtonClickForm2" method="post">
<s:if test="%{#session.HIDE_FIRST_BUTTON!=null}">
<ul>
<li>FIRST TEXT FIELD VALUE - <s:property value="%{#session.FIRST_TEXT_FIELD}"/></li>
</ul>
<s:textfield name="secondtextfield" key="label.secondtextfield" size="20"></s:textfield>
<s:submit key="label.secondButton" align="center" onclick="clickSecondButton(this.form)"></s:submit>
</s:if>
<s:else>
<s:textfield name="firsttextfield" key="label.fisttextfield" size="20"></s:textfield>
<s:submit key="label.firstButton" align="center"></s:submit>
</s:else>
</s:form>

LoginAction.java

package net.patel.struts2;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;

public class LoginAction {
private String username;
private String password;
private String firsttextfield;
private String secondtextfield;

public String execute() {
Map session = (Map) ActionContext.getContext().getSession();
session.clear();
if (this.username==null)
return "success";

if (this.username.equals("admin")
&& this.password.equals("admin123")) {
return "success";
} else {
return "error";
}
}

public String firstButtonClick() {
System.out.println("{firstButtonClick} "+firsttextfield);
Map session = (Map) ActionContext.getContext().getSession();
session.put("HIDE_FIRST_BUTTON", "Y");
//session.put("FIRST_TEXT_FIELD", firsttextfield);
return "success";
}

public String secondButtonClick() {
Map session = (Map) ActionContext.getContext().getSession();
System.out.println("{secondButtonClick} firsttextfield-"+session.get("FIRST_TEXT_FIELD")+" II TF-"+secondtextfield);

return "success";
}

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public String getFirsttextfield() {
return firsttextfield;
}

public void setFirsttextfield(String firsttextfield) {
this.firsttextfield = firsttextfield;
}

public String getSecondtextfield() {
return secondtextfield;
}

public void setSecondtextfield(String secondtextfield) {
this.secondtextfield = secondtextfield;
}

}

struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<constant name="struts.custom.i18n.resources" value="ApplicationResources"></constant>
<package name="default" extends="struts-default" namespace="/">
<action name="login" class="net.viralpatel.struts2.LoginAction">
<result name="success">Welcome.jsp</result>
<result name="error">Login.jsp</result>
</action>
<action name="*Form2" class="net.viralpatel.struts2.LoginAction" method="{1}">
<result name="success">Welcome.jsp</result>
<result name="error">Login.jsp</result>
</action>
</package>
</struts>

ApplicationResources.properties

 label.username= Username
label.password= Password
label.login= Login
label.fisttextfield=First Text Field
label.firstButton=First Button
label.secondtextfield=Second Text Field
label.secondButton=Second Button

尽量说得更清楚,我对这个问题缺乏想法,即使它听起来很经典:我花了几个小时尝试解决这个问题,但一无所获。非常感谢您的帮助。

最佳答案

您可以使用 HTML5 SessionStorage (window.sessionStorage)。您将生成一个随机 ID 并保存在每个浏览器选项卡的 session 存储中。然后每个浏览器选项卡都有自己的 Id。

“使用 sessionStorage 存储的数据不会跨浏览器选项卡持久保存,即使两个选项卡都包含来自同一域来源的网页。换句话说,sessionStorage 中的数据不仅限于调用页面的域和目录,而且页面所在的浏览器选项卡。将其与 session cookie 进行对比, session cookie 会在选项卡之间持久保存数据。”

关于java - jsp中跨选项卡的 session 管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30077152/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com