| 订阅 | 在线投稿
分享
 
 
 

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

来源:互联网  宽屏版  评论
2007-06-23 04:20:01

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环境下。

Liferay额外研究(一):[url=http://blog.csdn.net/james999/archive/2006/07/26/979938.aspx]http://blog.csdn.net/james999/archive/2006/07/26/979938.aspx[/url] Liferay额外研究(二):[url=http://blog.csdn.net/james999/archive/2006/07/27/986386.aspx]http://blog.csdn.net/james999/archive/2006/07/27/986386.aspx[/url] 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环境下。
󰈣󰈤
 
 
 
>>返回首页<<
 
 热帖排行
 
 
王朝网络微信公众号
微信扫码关注本站公众号wangchaonetcn
 
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
©2005- 王朝网络 版权所有