2014-01-08 65 views
2

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

这里是如何我设置会话属性

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

但是在我的本地工具箱其工作正常,但是当它被部署到服务器有这个问题

请建议对此

任何解决方案

谢谢 Ankit

+0

您的页面顶部是否有<%@ page session =“true”%>语句? – DanielBarbarian

+0

您的生产部署是否集群?如果是这样,您是否开启了会话相关性? –

回答

0

简短的回答是不要这样做。 WebSphere Commerce通常部署在分布式环境中,并且在部署代码时可能会看到这种效果。跨应用程序在WebSphere节点上保持会话对于应用程序来说是很多工作。而是使用一个cookie,或创建一个数据库表。你试图在那张必须进行会话的地图中存储什么?

0

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

会话状态被序列化到数据库,并且在用户会话转到群集中的另一台服务器时可用。

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

然后,你需要:

您可以通过在WC \ XML \ CONFIG \ BusinessContext.xml,像这样在BusinessContext.xml注册一个新的上下文元素加入自己的会话状态知道哪些种类的会话您的上下文将出现在

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

的情况下将与所有其他上下文一起创建的,将被序列化到无论是CTXDATA达tabase表(针对已知用户)以及针对匿名用户的浏览器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