Liferay Portal额外研究(三):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环境下。

时间: 2024-09-26 03:53:27

Liferay Portal额外研究(三):IFrame Portlet地session丢失疑难处理的相关文章

Liferay Portal之jbpm配置

这几天经过多方查找,在Liferay的论坛上找到了答案,希望对如何在Liferay中部署使用jpbm工作流感兴趣的朋友有所帮助. 1.首先下载 Liferay Portal Professional 4.2.1 (Bundled with Tomcat for JDK 5.0) 2.使用其默认的 HSQL 数据库,即不去更改其数据库配置. 3.下载 liferay-portal-servicemix-4.2.1.war 和 iferay-portal-jbpm-4.2.1.war http://

Liferay MinifierFilter的研究

大家都知道,在Web应用程序中,为了节省网络开销,往往吧多个小的js文件整合成一个大的js文件,吧多个小的css文件整合成一个大的js文件,这样原本N次小文件的请求就可以合并成单次的网络请求.最典型的做这件事情的工具是大名鼎鼎的yui-compressor. 其实在Liferay中,我们为了达到合并css,js的目的,用了不同于yui-compressor的方法,这就是我们的主角 MinifierFilter. 既然是Filter,那么它肯定有filter-mapping,我们轻易的在lifer

PHP:IE下的iframe跨域导致session丢失问题解决方法

今天搞的一个登录页面,被别的网站用iframe嵌进去后,死活无法登录(只在IE中存在这种情况). 很明显,session无法被保存.但是直接在地址栏打开那个登录页面,一切都正常啊.真是奇怪啊. 在网上搜索了一下.发现这个问题还真有不少人提及到.最后的解决方法是在那个登录页面里加上以下代码: 代码如下: <span style="font-family:Microsoft YaHei; font-size:14px">header('P3P: CP="ALL ADM

PHP关于IE下的iframe跨域导致session丢失问题解决方法_php技巧

今天搞的一个登录页面,被别的网站用iframe嵌进去后,死活无法登录(只在IE中存在这种情况). 很明显,session无法被保存.但是直接在地址栏打开那个登录页面,一切都正常啊.真是奇怪啊. 在网上搜索了一下.发现这个问题还真有不少人提及到.最后的解决方法是在那个登录页面里加上以下代码: 复制代码 代码如下: <span style="font-family:Microsoft YaHei; font-size:14px">header('P3P: CP="AL

session丢失,跳出iframe框架

在iframe框架开发的网站中,如果在struts2中配制了session丢失就跑到登陆网页,这里的登陆网页会被嵌入到显示内容的那块区域,怎么能够让它替换整个窗口, 跳出iframe框架 呢? 解决session过期跳转到登陆页面并跳出iframe框架 在你想控制跳转的页面,比如login.jsp中的<head>与</head>之间加入以下代码: Js代码 <script language="JavaScript">   if (window !=

请问哪位高手对Liferay Portal 的源码有研究?或者对在Liferay Portal 上进行Portlet开发有研究的,请指点一下学习路线。谢谢

问题描述 请问哪位高手对LiferayPortal的源码有研究?或者对在LiferayPortal上进行Portlet开发有研究的,请指点一下学习路线.谢谢 解决方案 解决方案二:以前想用来着,LIFERAY太大大难,作罢.解决方案三:在源码上开发了3个月,还是有点理不清,那东西有点难!不好说.

liferay的稍微复杂的一个portlet实例

一.实例 这里我们采用portal里面代码规范生成机制.对于持久化层和服务层的类都可以自动产生. 我们的portlet功能很简单就是从数据库里面一个表中获取数据,并在页面上显示. 建立业务数据表 在数据库里面新建一个表users,字段userid(varcher),username(varcher),password(varcher).并往表中插入几个条数据. 建立代码模板配置文件 (1)建立service.xml文件 在ext\ext-impl\src\com\ext\portlet 新建一个

liferay portal介绍

PORTAL是什么 portal是一个基于web的应用,它能提供个性化,单点登陆,不同源的内容聚合,和信息系统的表示层集中.聚合是整合不同web页面源数据的过程.为了提供用户定制的内容,portal可能包含复杂的个性化特征.为不同用户创建内容的portal页,可能包含不同的portlet集. 表示了portal的基本架构.portal web应用处理客户请求,找回用户当前页中的portlet,然后调用portlet容器,从新获取各个portlet的内容.portlet容器提供portlet的运行

portal学习(二)portlet开发之hello world

portal开发的一个重要工作就是portlet的开发,网上一大堆hello world,都是最简单的,用PrintWriter输出字符串.今天介绍一下稍微复杂的,用户转到portlet的edit Model,该页面是有一个输入框和一个按钮,输入你的名字,然后提交,将转到此portlet的view Model并输出hello,your name.     portlet与servlet非常相似,因为portlet就是在servlet规范的基础上扩展的,并且portlet容器也是在servlet容