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

标签 java jsp session struts2 session-variables

技术--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/

相关文章:

java - 关于 Super 关键字?

java - 在 Play 中设置环境变量!框架

java - 在启动时删除 gluon-mobile 对话框

java - Spring MVC JSTL预选列表

php - 是否有最大 PHP session 数?

java - JCR 2.0如何正确使用session

java - Sql 中的 BIGINT 与 Java 中的 BigInteger 之间的映射

javascript - 如何使用 html 或 jsp 将数据以 xml 形式发布到服务器

jsp - 如何将 POST 请求从 servlet 重定向到另一个应用程序

android - 不同 session 中 PWA 的可信 Web Activity