2015-05-06 2 views
1

JSP Technology-- Struts2 & JSPуправления сеансом между вкладками в

  1. Доступ URL-- http://localhost:8080/session_acroos_tab/login.action

  2. В пользователя welcome.jsp входит какое-то значение в 'первое текстовое поле' и нажимает на «Первая кнопка».

  3. При нажатии этой кнопки (первая кнопка), функция firstButtonClick LoginAction.java называется.
  4. Теперь управление снова перейдет на Welcome.jsp. На этом значении jsp, введенном пользователем в поле «Первое текстовое поле», отображается
  5. Пользователь должен ввести некоторое значение в поле «Второе текстовое поле» и нажимает кнопку «Вторая кнопка».
  6. При нажатии этой кнопки (вторая кнопка), вызывается функция secondButtonClick LoginAction.java, и управление снова должно перейти на страницу Welcome.jsp.

Перед выполнением пятого шага, если пользователь откроет новую вкладку и выполнит шаги с 1-го по 3-й и снова вернется на вкладку-1 и выполнит оставшиеся шаги, чем все данные сеанса, запущенные. Я знаю, что все открытые новые вкладки должны делиться одним и тем же сеансом, но чем это решение. Я хочу работать обе вкладки самостоятельно.

welcome.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 

Постарайтесь быть более ясным, я в отсутствие идей в этой проблеме, даже это звучит как классический: Я тратить часы, пытаясь играть с этим, но не получили нигде Ваша помощь очень ценится.

+1

Вы можете использовать некоторый токен, чтобы * идентифицировать * вкладку. –

+1

Перед тем, как приветствовать страницу, создайте некоторый токен и передайте его. Когда вторая вкладка открыта, токен будет отличаться от первой вкладки, и вы можете показывать значения в соответствии с токеном. –

ответ

1

Вам всегда понадобится токен. Он может быть сгенерирован и поддерживается как server-side (Java), так и client-side (HTML5 sessionStorage).

Затем его можно использовать для привязки определенной страницы/вкладки к определенному набору атрибутов сеанса путем их параметризации.

Примером серверного способа является создание токена в BaseAction, расширенном всеми остальными. Было бы лучше сделать это в перехватчике, но это зависит от вас.

В этом случае , поскольку он не является маркером безопасности (например, токен для противодействия XSRF, который должен быть не предсказуемым), вы можете использовать текущее время как токен.

E.g. серверной стороне маркера:

public abstract class BaseAction extends ActionSupport 
            implements SessionAware { 

    private Map<String,Object> session;  
    private String token; 

    public void setSession(Map<String,Object> session) { 
     this.session = session; 
    } 
    public void setToken(String token) { 
     // Retrieve the Token from the page, if any 
     this.token = token; 
    } 
    public String getToken() { 
     if (token==null){ 
      // Generates a new Token, only if it has not been passed from the JSP 
      token = System.currentTimeMillis(); 
     }  
     return token; 
    } 
    public void setTokenSessionAttribute(String k, Object v){ 
     session.putSessionAttribute(getToken() + "_" + k,v); 
    } 
    public Object getTokenSessionAttribute(String k){ 
     return session.getSessionAttribute(getToken() + "_" + k); 
    } 


    public String execute(){ 
     return SUCCESS; 
    } 

    public String firstButtonClick() { 
     setTokenSessionAttribute("FIRST_TEXT_FIELD", firstTextField); 
     return SUCCESS; 
    } 

    public String secondButtonClick() { 
     log.debug("Saved value was: " + getTokenSessionAttribute("FIRST_TEXT_FIELD")) 
     return SUCCESS; 
    } 
    private String firstTextField; // with setter 

} 

в ваших JSPs:

<s:form ... > 
    <!-- stuff --> 
    <s:hidden name="token" /> 
    <!-- stuff --> 
    <s:if test="%{#session[token+'HIDE_FIRST_BUTTON']!=null}"> 
     <!-- stuff --> 
    <!-- stuff --> 
</s:form> 

Это один из многих способов, например, вы можете создать метод в действии возвращающегося право, параметризацию атрибут сеанса:

public Object getTabSessionObj(String k){ 
    return session.get(token + "_" + k); 
} 
<s:if test="%{getTabSessionObj('HIDE_FIRST_BUTTON')!=null}"> 
+0

... Thanx для ответа! Теперь ключ сеанса был изменен динамически, новый новый ключ сеанса - HIDE_FIRST_BUTTON + $ systemCurrentTime. Как я могу получить доступ к нему в JSP через OGNL expr? Теперь код () должен быть изменен. – user595014

+1

Я добавил его к ответу –

+1

Примечание: Текущее время не является хорошим выбором для токена. –

3

Вы можете использовать HTML5 SessionStorage (window.sessionStorage). Вы создадите случайный идентификатор и сохраните в сеансе Хранение на вкладке браузера. Тогда каждая вкладка браузера имеет свой собственный идентификатор.

«Данные, хранящиеся с использованием sessionStorage, не сохраняются на вкладках браузера, даже если две вкладки содержат веб-страницы из одного и того же источника домена. Другими словами, данные внутри sessionStorage ограничиваются не только доменом и каталогом вызывающей страницы, но вкладку браузера, в которой находится страница. Контрастность этого для файлов cookie сеансов, которые сохраняют данные с вкладки на вкладку ».

Смежные вопросы