сеанс сбрасывается в IBM Websphere Commerce

Я устанавливаю сеанс в jsp с помощью скрипта в IBM WCS и устанавливаю значение здесь, но при перезагрузке страницы значение сеанса теряется.

вот как я устанавливаю атрибут сеанса

<%
session.setAttribute("testMap", testValue);
%>

Однако в моем локальном наборе инструментов он работает нормально, но когда он развернут на сервере, возникает эта проблема.

Пожалуйста, предложите любое решение по этому поводу

Спасибо, Анкит.


person ankit gupta    schedule 08.01.2014    source источник
comment
У вас есть утверждение ‹%@page session=true %› в верхней части страницы?   -  person DanielBarbarian    schedule 13.01.2014
comment
Является ли ваше производственное развертывание кластерным? Если да, то включена ли привязка к сеансу?   -  person Steve McDuff    schedule 03.02.2014


Ответы (2)


Состояние сеанса в Websphere Commerce сохраняется в бизнес-контексте, который привязан к пользовательскому ActivityToken.

Состояние сеанса сериализуется в базе данных и будет доступно, если сеанс пользователя переходит на другой сервер в кластере.

Вы можете добавить свое собственное состояние сеанса, зарегистрировав новый элемент контекста в BusinessContext.xml в файле WC\xml\config\BusinessContext.xml, например:

 <BusinessContext ctxId="MyContext"
               factoryClassname="com.ibm.commerce.context.factory.SimpleBusinessContextFactory" >
<parameter name="spiClassname" value="com.myorg.commerce.context.contentimpl.MyContextImpl" />

Then you need to tell which kinds of sessions your Context will be present in

<!-- web site store front configuration -->
<InitialBusinessContextSet ctxSetId="Store" >
    ...
  <InitialBusinessContext ctxId="MyContext" createOrder="0" />

Контекст будет создан вместе со всеми другими контекстами и будет сериализован либо в таблицу базы данных CTXDATA (для известных пользователей), либо в файл cookie браузера для анонимных пользователей.

Ваш класс контекста должен выглядеть примерно так:

Класс интерфейса com.myorg.commerce.context.mycontextimpl.MyContext

public abstract interface MyContext extends Context
{
   public static final String CONTEXT_NAME =     "com.myorg.commerce.context.mycontextimpl.MyContext";
   public abstract String getSomeValue();
   public abstract void setSomeValue(String v);
}

И открытый класс реализации MyContextImpl расширяет AbstractContextImpl, реализует MyContext {}

После установки нового значения используйте «this.setDirty(true)», чтобы пометить изменения для сохранения.

Вы также должны переопределить getContextAttributes, чтобы вернуть значения вашего контекста, которые необходимо сериализовать, и setContextAttributes, чтобы восстановить значения.

Дело в том, что контекст делает больше, чем просто хранит значения. Вы помещаете инварианты в контекст, который должен соблюдаться для всех аспектов взаимодействия пользователей с сайтом. Лучшим примером является EntitlementContext, который содержит контракты, по которым вы покупаете, что может быть довольно сложно вычислить.

В любом случае, чтобы получить доступ к вашему контексту из команды, вы должны использовать

this.getCommandContext().getContext(MyContext.CONTEXT_NAME);

И из JSP

if (request.getAttribute("myContext") == null) {
    request.setAttribute("myContext", ((CommandContext) request.getAttribute("CommandContext")).getContext(MyContext.CONTEXT_NAME));
}

после чего вы можете использовать его как ${myContext.someValue}

person Soraz    schedule 06.05.2015

Короткий ответ: не делайте этого. WebSphere commerce обычно развертывается в распределенной среде, и вы можете увидеть эффект от этого, когда ваш код будет развернут. Приложению требуется много работы для сохранения сеанса между узлами WebSphere. Вместо этого используйте файл cookie или создайте таблицу базы данных. Что вы пытаетесь сохранить на этой карте, которая должна быть в сеансе.

person Michael Rasmussen    schedule 06.05.2015