胡长城(银狐999)BLOG

专注SOA,MDA,EAI,BPM,工作流,J2EE;个人主页http://www.javafox.org

用户操作
[即时聊天] [发私信] [加为好友]
胡长城ID:james999
566286次访问,排名69好友0人,关注者69
J2EE,Workflow,BPM,EAI,SOA,工作流
james999的文章
原创 187 篇
翻译 0 篇
转载 2 篇
评论 635 篇
银狐999的公告
个人主要工作流文档可从 javafox live网络硬盘下载

最近评论
d_yang:反射, 是因为没用好.
downdoc2:把思路和一些方法多讲讲把
kwlong2008:来看看朋友,最近过的怎么样?俺的空间是介绍网站制作网站建设的,有时间也常去一下我的空间谢谢,来看看朋友,最近过的怎么样?俺的空间是介绍网站制作网站建设的,有时间也常去一下我的空间谢谢,来看看朋友,最近过的怎么样?俺的空间是介绍网站制作网站建设的,有时间也常去一下我的空间谢谢,
收藏
    相册
    50 Relational Blogs
    Hongsoft博客
    J2EE与ERP禅话
    Peter's Blog
    俠盜躶奔漢
    切尔斯基(RSS)
    动物园的猪
    胡奇
    赵斌BLog
    阿飞外传
    55 Workflow Preacher
    Ekkart Kindler
    Michael zur Muehlen
    Wil van der Aalst
    存档
    订阅我的博客
    XML聚合  FeedSky

    原创 Liferay Portal额外研究(三):IFrame Portlet的session丢失问题解决收藏

    新一篇: Liferay Portal额外研究(4):修改用户登录后的默认布局和内容 | 旧一篇: 工作流与PetriNet两种节点的新诠释


    Liferay额外研究(一):http://blog.csdn.net/james999/archive/2006/07/26/979938.aspx 
    Liferay额外研究(二):http://blog.csdn.net/james999/archive/2006/07/27/986386.aspx

    Liferay额外研究(三):IFrame Portlet的session丢失问题解决


           Liferay
    提供了一种非常的简单web应用整合和单点登陆的方式:Iframe Portlet。利用Iframe Portlet可以很容易将一个已经存在的web应用纳入,并且支持利用form的post或get方式,实现用户的登陆。
     
           对于Liferay这样的机制没有任何问题,实现的也非常巧妙;但是对于很多web应用系统来说,使用Liferay IFrame Portlet的form方式实现登陆后,虽然可以成功登陆,但是在显示的新页面中,却发现用户信息丢失,或者更准确的说,是session丢失。
     
           其实,这种现象跟Liferay关系不大,而是应用本身决定的。事实上,所有的portal context的iframe 方式,都有可能发生这个情况。
     
           因为很多web应用系统,在执行Login操作的后,习惯性的选择redirect操作,这样会强制浏览器中的显示地址变更为转移的地址。事实上这是个很正确的做法,在正常境况下,不会有任何问题,而且还可以很好的防止页面刷新等所带来的问题。
     
           但是在Liferay的IFrame Portlet中,web应用这样的Redirect操作,造成了调转到新页面后,session变成了一个新的,从而造成放置在原有session中的login user信息丢失。
     
           跟踪并做了如下的一组测试(Liferay和webapp在不同的JVM环境下):
    应用
    位置
    session id
    (Liferay)
    执行form post前
    D03E1B828395EF5BCB1063A8290BD254
    (APP_A)
    Login操作
    397BB3656E2A12A96CE3F16E0A89C607
    (APP_A)
    登陆后的新页面
    58A1054C6EDE4A7D6CFA2FCDBB3E0736
           从上面可以明显看出来,redirect之后,web应用的新页面产生了新的sessionid      
     
           解决这个问题,有两种方式,这两种方式都依赖于被liferay portlet纳入的web应用自身。
           方式一:Login操作后,不采用Redirect方式,而是Dispatcher方式。
           方式二:Login操作后,依然采用redirect方式,但将当前的jsessionid赋予新的页面。
     
    Dispatcher方式:
     
    ServletContext sc = getServletContext();
    RequestDispatcher rd = null;
    rd = sc.getRequestDispatcher("/index.jsp");
    rd.forward(request, response);
     
    Redirect方式(保持同一个session):
          
    response.sendRedirect(“
    index.jsp;jsessionid=397BB3656E2A12A96CE3F16E0A89C607)
           有一种情况下,无所谓是否采用Redirect方式,这就是在Liferay和webapp在同一个JVM环境下。
     

    发表于 @ 2006年08月08日 12:39:00|评论(loading...)|编辑

    新一篇: Liferay Portal额外研究(4):修改用户登录后的默认布局和内容 | 旧一篇: 工作流与PetriNet两种节点的新诠释

    评论

    #HH 发表于2006-08-15 17:31:00  IP: 219.239.27.*
    应该是 SESSIONID 冲突造成的吧。例如,用 weblogic 的话,可以在 weblogic.xml 中设置:
    <session-descriptor>
    <session-param>
    <param-name>CookieName</param-name>
    <param-value>PORTALSESSIONID</param-value>
    </session-param>
    </session-descriptor>
    发表评论  


    当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
    Csdn Blog version 3.1a
    Copyright © 银狐999