`
pleasetojava
  • 浏览: 721166 次
  • 性别: Icon_minigender_2
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

portlet session共享

 
阅读更多

一,问题描述
用户会话session是servet规范中标准的对象,它代表了用户活动的生命周期,因此在我们以往的web开发中,经常将用户信息放置到 session对象中。然而随着真正意义上的portal时代的到来,portlet的开发让身在其中的人们感到了稍许的不自在,其中很重要的一个因素就 是对于session的管理。

在portal中,一个war是一系列portlet的组合,它的意义等价于以前servlet开发中的webapp,因此一个portlets 的war就代表了部署在portal server上的一个应用程序,我们又知道在servlet规范中,session的范围是和用户会话相关的,而此会话是相对于具体的某个应用的,即同一 个用户登录到不同的web应用后,他的session也是不同的,例如某个用户登录了部署在同一个服务器上的两个web应用:办公自动化系统和财务系统, 那么在办公自动化系统中会有该用户的一个sesion,而在财务系统中会有用户的另外一个不同的session。

在portal server中也是这样的,既然不同的portlets war代表不同的应用,那么不同的portlets war之间session也是不同的,即是不能共享的。我想这是我们所能接受的,但是在同一个portlets war中的portlet之间共享session,这应该是个可以达到的基本要求吧,但是对于这一点,不同的portlet规范给出的答案也是不一样的。

下面我们看一下JSR168和IBM Portlet对session问题的回答。

二,不同portlet规范对session问题的回答

1,JSR168方面

JSR168是JCP关于portlet的一个标准,它在自己框架中加入了对session问题的解决方法,在JSR168中,portlet session是可以设置作用范围的,目前有两个作用范围:应用范围(application_scope)和portlet范围 (portlet_scope),对于应用范围的session属性,是在同一个portlets war中共享的,而对于portlet范围的session属性,只能是在该portlet具体实例内共享的。如下是JSR168规范中的API:

PortletSession session = request.getPortletSession();

session.setAttribute("attributeName1", "attributeValue1", PortletSession.APPLICATION_SCOPE);
session.setAttribute("attributeName2", "attributeValue2", PortletSession.PORTLET_SCOPE);
session.setAttribute("attributeName3", "attributeValue3");

如上,设置了session属性的范围后,attributeName1是可以在整个portlets war内取到的,而attributeName2只能在该portlet 实例内取到,attributeName3没有设置作用范围,则默认位portlet_scope,因为也只能在该portlet实例内取到。

2,IBM Portlet方面

可以说IBM portlet在同一个portlets war内session的共享做的很不够,在wps4.1中可以通过如下方面解决:在web.xml的servlet定义中,加入下面的参数:

< init-param>
    < param-name> com.ibm.wps.portlet.session< /param-name>
    < param-value> shared< /param-value>
< /init-param>

但是这种共享并不是想象中的在portlets war内共享,而是只有部署在同一个页面中的该war中的portlet实例之间才能共享session,也就是说,即使是同一个portlets war的portlets,如果被部署在不同的页面,那么他们之间的session也是不能共享的,这显然限制很大,没有太大的实际上的意义。

三,实际的portlet项目开发中,该如何解决session的问题

通过前面已经知道,如果使用JSR168开发,则问题基本上可以解决,具体请参看上面的叙述,但是如果使用IBM portlet开发,则需要使用其它方式了。下面介绍的是针对IBM portlet在session方面所做的一种方式,效果还是可以的。

通过查阅相关资料以及进行相关实验,我们最终发现,IBM portlet session基本上只能在具体的 concrete portlet实例(即已经部署到页面中的某个portlet实例)范围内有效,因此我们每个portlet都需要重新组建session,即通过用户标 识以及其它一些辅助类,获取用户相关信息并将信息设置到portlet session之中,为了能让每个portlet在做就体逻辑之前就将session信息初始化好,我采用如下的一个方案:

通过IBM portlet规范知道,每个concrete portlet可以定义他的视图默认页面,我们一般定义为某个路径下的index.jsp,因为到index.jsp的时候,portlet的其它逻辑还 没有执行,因此此时是获取用户相关数据并存放到portlet session中的好时机,如下:


<%@ taglib uri="/WEB-INF/tld/portlet.tld" prefix="portletAPI"%>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<portletAPI:init/>
<%
//获取相关数据放置到session属性中。
com.ibm.portal.puma.User portalUser= (com.ibm.portal.puma.User) portletRequest.getUser();
String userId=portalUser.getUserID();
session.setAttribute("userId",userId);
String department=new UserManager().getUserDepartmentBySn(userId);
session.setAttribute("department",department);
//准备完session信息后,导向到具体的应用逻辑页面。
portletConfig.getContext().include("next.jsp",portletRequest,portletResponse);
%>
按照上面的方式,原来需要在HttpSession存储的信息,现在每个需要这些信息的portlet都自己去后台取一次,然后设置到自己的PortletSession之中。这种方式虽然感觉笨了一些,但至少是一种解决方式,可以尝试一下,还是不错的。

四,从portlet session问题看portal

portlet session的问题可能是不少人所不能理解的,为什么用户登录portal后,他所看到的东西可能不是在同一个session范围内,为什么同一个用户看到的不同的portlet可能会属于不同的session。其实这涉及到对portal的理解问题。

portal我们知道是门户的意思,也知道上面是一个个的portlet应用,每个portlet可能代表着一个不同的应用,这里的应用和上面说的应用可能概念还不太一样,这里的应用主要是指业务。

另外我们知道portlet有自己的规范,只要按照规范开发出的portlet,则就可以部署到portal server之中,那么在portal server中,很有可能包含了各种各样的portlet,有些portlet是同一个业务的,而另外一些portlet是为另一个业务的,请注意一 点,portal server中的这些业务,并不一定只包含你自己做的,或你们公司自己做的,也有可能包含各个厂商自己已经做好的,还有可能客户后来又新添加的。

这样一来,如果不同业务或风马牛不相及的业务之间可以共享session的话,那么很可能会引起session的混乱,例如厂家A的 portlet在session中设置了company属性为company_A,而厂家B的portlet在session中设置了company属性 为company_B,如果session是在用户登录后的所有portlet之间共享的话,那么就会引起数据混乱,而导致严重的业务问题。

基于此,portal server中提出了portlets应用的概念(portlet war),一个portlets 应用就是一组portlets,这些portlets被打成一个符合portal要求的war包,然后可以部署到portal server之中。在portal server中,portal会将每个portlet应用看作是一个独立的应用,就好像是Tomcat下的webapps中的应用一样,也许你觉得将 portlets 应用看作是web应用很难,但你想一想,一个portlets应用中,包含了一个web应用所有的东西,有独立的web.xml,有独立的lib和 classes以及tld等等,只能说portlet应用不仅是一个web应用,而且是一个实现了portlet功能的更为强大的web应用。

我们知道一个portal server中可以部署多个这样的portlet 应用,这实际上就相当于在一个portal server中部署了多个web应用,再想下去你可能会觉得非常惊叹:既然不同的portlet war是不同的web应用(就像tomcat webapps下的应用一样),那么我们登录portal后,实际上看到的是多个web应用的聚合,不知你是否理解我现在说的,你想想以前访问 tomcat时,我们一般都是通过某个context path然后访问到webapps下的具体应用,但是你是否想过如果将webapps下的所有应用在一个系统在内聚合访问,那将是怎样的一番景象 呢!portal做的就是这个!

因此portets 应用(portlets war)之间不能共享session是理所当然的,就好像tomcat webapps下的不同应用不能共享session是一个道理,当然同一个portlets应用内(即同一个web应用内)共享session这应该是被 支持的,JSR168做的就很好,IBM的portlet在这方面真是有些问题。

基于此我们再理解一下Websphere中的server1和WebSphere_Portal两个服务器,我们以前可能会奇怪,为什么我们可以 直接在server1部署web应用程序,然后通过url进行访问,而WebSphere_Portal中却不可以部署web应用程序然后通过url访问 呢,现在可以告诉你,server1部署的web应用是符合servlet标准的web应用,或者说是普通的web应用,而再 WebSphere_Portal中实际上也可以部署web应用,只是只能部署较为特殊的一种web应用,即portlets应用。另外我们在 Websphere控制台中只能部署企业级应用程序(包括普通的web应用),我们在里面找不到可以部署portlet这种特殊web应用的地方,实际上 我们都清楚,portlet应用的部署是在portal的管理短实现的,而不是在websphere的控制台中。

0
1
分享到:
评论

相关推荐

    portlet开发高层设计

    这包括但不限于portlet的生命周期管理、portlet间的通信、session共享以及用户界面设计。通过遵循这些原则,开发者可以创建出高效、灵活且适应性强的portlet应用程序,满足用户在门户环境中的多样化需求。

    IBM portlet开发指南

    但是,Portlet中的Session需要与Portal环境协调,以实现Portlet之间的状态共享。 #### 请求分发给Servlets和JSPs Portlet可以将请求分发给Servlets和JSPs进行处理,这需要通过PortletRequestDispatcher来实现。...

    JSR168_Portlet开发入门

    4. `PortletSession`:类似于Servlet中的session,用于在portlet之间共享状态信息。 5. `RenderRequest`和`RenderResponse`:在渲染阶段使用,用于构建最终的HTML页面。 6. `ActionRequest`和`ActionResponse`:...

    最新最全的Portlet 通信过程详解

    根据JSR 168规范,Portlet之间是相互独立的,并且它们不共享Session对象。因此,在Portal开发中实现Portlet间通信是一个重要的课题。Portlet之间通信的主要应用场景包括: 1. **当一个Portlet的状态发生改变时,...

    [Portlets.in.Action].Ashish.Sarin.文字版.pdf

    PortletSession用于在portlet之间共享数据。理解不同作用域(如PORTLET、APPLICATION)之间的区别以及它们对性能的影响至关重要。合理设置PortletSession的作用域可以帮助开发者有效地管理会话数据并避免潜在的问题...

    portal 开发指南

    PortalContext提供了对整个Portal应用上下文的访问,包括对Portlet之间的共享数据的支持。 #### 十七、PortletPreferences ##### 17.1 PortletPreferences接口 PortletPreferences接口提供了对Portlet配置信息的...

    spring学习笔记(五)

    5. **global session**:在Portlet环境下,全局session作用域用于整个portlet session,跨越多个portlet实例。 理解Bean Scope对于优化应用性能和资源使用至关重要。例如,singleton可以减少内存占用,但可能引发...

    spring中bean的范围(xml/annotation)

    5. **Global Session**:在portlet环境下,每个全局portlet session对应一个Bean实例。这是一个更高级别的Session范围,通常在PortletApplicationContext中使用。 接下来,我们分别看XML配置和注解方式来设置Bean的...

    liferay跨组件间通信实例

    `test-portlet`可以利用布局上下文将数据存储在session中,其他portlet可以通过读取该session来访问这些数据。 6. **门户上下文(Portal Context)**:Liferay提供了一个全局的门户上下文,允许所有portlet访问门户...

    struts2 会话技术

    - **Global Session范围**:在portlet环境下,全局会话范围允许在多个portlet间共享数据。然而,这不是所有Web应用的标准特性,仅适用于portlet应用。 2. **线程安全**: - 在多线程的Web环境中,数据存储范围...

    LiferayPortal二次开发指南破解版.pdf

    Session 对象用于存储用户会话期间的数据,实现跨请求的数据共享。 ##### 3.3.5 Preference 对象 Preference 对象用于存储用户的个性化设置,如首选语言、布局等。 **3.4 编写自己的 Portlet 类** ##### 3.4.1 ...

    liferay

    - **WSRP**:Web Services for Remote Portlets,一种用于远程 Portlet 的 Web 服务标准,允许 Portlet 在不同的门户之间共享。 ##### 1.2 什么是 Portal? - **Portal 服务器**:提供了一个集中的入口点,用于...

    BEA portal精华贴

    通常,Portal 会为每个用户会话维护一个全局 Session 对象,而每个 Portlet 可以有自己的局部 Session。Request 则是针对每个用户请求的短暂对象。 **7. 关于 SSO 和 Weblogic Portal** - **实现方式**:Weblogic ...

    尚学堂_Spring_0600_IOC_Bean_Scope

    这在多portlet共享数据时很有用。 在实际应用中,选择合适的Scope对于应用的性能和设计有着重要影响。例如,singleton Scope可以优化内存使用,而prototype Scope则提供了更大的灵活性。此外,Spring还提供了自定义...

    互联网高频Java后端面试题20道(适合1~3年)V1.0.74.docx

    - **Global Session**:在portlet环境中,全局会话作用域用于portlet应用,每个portlet窗口共享一个Bean实例。 问题 8:Java 中的异常处理机制是什么,它包括哪些关键字? Java 异常处理机制是一种用于处理运行时...

Global site tag (gtag.js) - Google Analytics