Jsp 使用websphere扩展在2个web项目之间共享会话管理bean

Jsp 使用websphere扩展在2个web项目之间共享会话管理bean,jsp,websphere,ibm-rad,Jsp,Websphere,Ibm Rad,我们必须在一个ear项目中使用websphere扩展在两个不同的web模块中使用相同的会话。如何从另一个web模块中的一个web模块获取会话。我们正在使用IBMRAD7.5、WebSphere7.0和JSP框架 到目前为止,我们已经尝试过这种方法 我们的项目结构 具有公共会话的公共项目 EAR项目 网络项目1 网络项目2 我们已经为我们的项目应用了websphere扩展 我们的web项目1包含first.jsp,我们从中发送会话。 代码-getFacesContext().getExternal

我们必须在一个ear项目中使用websphere扩展在两个不同的web模块中使用相同的会话。如何从另一个web模块中的一个web模块获取会话。我们正在使用IBMRAD7.5、WebSphere7.0和JSP框架

到目前为止,我们已经尝试过这种方法

  • 我们的项目结构
  • 具有公共会话的公共项目 EAR项目 网络项目1 网络项目2

  • 我们已经为我们的项目应用了websphere扩展
  • 我们的web项目1包含first.jsp,我们从中发送会话。 代码-getFacesContext().getExternalContext().getSessionMap().put(“键”,公共会话bean); 我们的web项目2包含sec.jsp,我们在其中接收会话。 代码-getFacesContext().getExternalContext().getSessionMap().get(“键”); 上面的代码返回一个对象,但我们需要公共会话,因此我们将返回的对象类型转换为公共会话类型
  • 现在,当我们在服务器上运行first.jsp时 我们得到了错误

  • java.lang.ClassCastException:common.session.Sess与common.session.Sess不兼容

    尝试将EAR类加载器策略更改为应用程序并使用Singleton模式,或者您可以使用DistributedMap(),这是特定于WebSphere的,但可以为对象存储和检索提供一个非常强大的类似于地图的界面。

    请看本页-,它描述了允许应用程序之间进行会话共享所需的所有步骤和配置。一般来说,您需要:

    • 使用会话中放置的所有对象创建隔离共享库
    • 在应用程序中检索会话对象

      HttpSession session=request.getSession()

    • 将此对象强制转换为IBMSession对象并调用getIBMApplicationSession方法

      IBMApplicationSession appSession=((IBMSession)会话).getIBMApplicationSession()

    • 像使用普通会话对象一样使用appSession

    • 将应用程序配置为使用共享会话扩展-使用以下属性创建ibm-application-ext.xml

    
    
    • 在安装期间将共享库映射到应用程序

    在这两场战争中,Sess的版本显然不同。请检查您的类路径。如果您想避免类路径问题,可以将整个对象序列化为JSON。我们已经为使用相同类的两个模块创建了会话bean。那么EAR类加载器策略呢?您是否使用classloader策略模块od应用程序。尝试将其更改为应用程序。如果我们希望将在一个模块中创建的会话管理bean共享到另一个web模块中(例如,不同web模块的一个登录会话bean),那么在我们的场景中,解决方案是什么?如果将classloader策略设置为APPLICATION,则所有应用程序模块都具有相同的classloader然后您可以使用Singleton模式(在JavaEE中确实不可取,但您可以使用它),或者使用WebSphere提供的DistributedMap之类的东西().Distributed Map还返回对象类型的值,但我需要common.session.Sess类型的值,因为我希望在第二个web项目中有完整的会话管理bean,例如,让登录会话在第一个web项目中,我需要在第二个web项目中有此会话。因此,我需要将Distributed Map返回的对象值类型转换为common.session类型关于.Sess???在DistributedMap中,您可以添加任何对象,只要它实现java.io.Serializable,或者您可以将对象转换为其他可序列化的形式,例如JSON或XML。换句话说,当从DistributedMap执行get()时,您必须将对象强制转换为Sess。在执行get()时,您是否可以显示将对象强制转换为Sess的示例来自DistributedMap,因为当我们尝试将对象强制转换为Sess时,正在执行get()从SessionMap我们得到以下错误java.lang.ClassCastException:common.session.Sess与common.session.session不兼容我想你的代码还可以,你的类加载器仍然有问题。你检查过你的EAR类加载器策略吗?在我们的例子中,我们没有使用Http Servelet。我们有会话管理bean,它存储r示例登录会话存储所有登录详细信息。现在我们需要使用这个sesseionbean,即登录会话bean到另一个web模块中。因此,我们使用了sessionMap()从中我们可以传递值,即字符串值,但是当我们尝试发送公共会话bean,然后在另一个web模块中检索该会话bean时,它会给出错误java.lang.ClassCastException:common.session.Sess与common.session.sessry不兼容,从而将该common.session.Sess类添加到库中,并将其放在ear级别,不是在每个web应用程序中。您是否按照Miljenko的建议将类加载器策略更改为应用程序而不是模块?
    <application-ext xmlns="http://websphere.ibm.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-application-ext_1_1.xsd" version="1.1">
       <shared-session-context value="true"/>
    </application-ext>