会话正在IBM Websphere Commerce中重置



我正在使用IBM WCS中的scriplet在jsp中设置会话,并在此处设置值,但当重新加载页面时,会话值会丢失。

以下是我如何设置会话属性

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

然而,在我的本地工具包上,它工作得很好,但当它部署到存在此问题的服务器时,

请就提出任何解决方案

谢谢Ankit

Websphere Commerce中的会话状态保存在绑定到用户ActivityToken的业务上下文中。

会话状态被序列化到数据库,如果用户会话转到群集中的另一台服务器,则会话状态将可用。

您可以通过在WC\xml\config\BusinessContext.xml的BusinessContext.xml中注册一个新的上下文元素来添加自己的会话状态,如下所示:

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

然后你需要告诉你的上下文将出现在中的会话类型

<!-- 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以重新建立值。

关键是,上下文不仅仅是存储值。您将不变量放在上下文中,这应该适用于用户与站点交互的所有方面。最好的例子是EntitmentContext,它保存了您正在购买的合同,计算起来可能相当复杂。

无论如何,要从命令访问上下文,您可以使用

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}

简单的答案是不要这样做。webspherecommerce通常部署在分布式环境中,当部署代码时,您可能会看到它的效果。对于应用程序来说,要在WebSphere节点之间持久化会话需要做大量工作。而是使用cookie,或者创建一个数据库表。你试图在必须处于会话中的映射中存储什么。

最新更新