﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-专注应用，关注发展，开拓创新-文章分类-门户-JBOSS-Protal </title><link>http://www.blogjava.net/esdsoftware/category/10783.html</link><description>&lt;-------------------------------------------------------------------&amp; 珍惜生命 . 善用时间 . 把握未来 . 创造价值。</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 12:19:14 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 12:19:14 GMT</pubDate><ttl>60</ttl><item><title> Liferay Portal额外研究（三）：IFrame Portlet的session丢失问题解决</title><link>http://www.blogjava.net/esdsoftware/articles/69508.html</link><dc:creator>吴名居</dc:creator><author>吴名居</author><pubDate>Wed, 13 Sep 2006 15:54:00 GMT</pubDate><guid>http://www.blogjava.net/esdsoftware/articles/69508.html</guid><wfw:comment>http://www.blogjava.net/esdsoftware/comments/69508.html</wfw:comment><comments>http://www.blogjava.net/esdsoftware/articles/69508.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/esdsoftware/comments/commentRss/69508.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/esdsoftware/services/trackbacks/69508.html</trackback:ping><description><![CDATA[       Liferay提供了一种非常的简单web应用整合和单点登陆的方式：Iframe Portlet。利用Iframe Portlet可以很容易将一个已经存在的web应用纳入，并且支持利用form的post或get方式，实现用户的登陆。
<div> </div><div><span>       </span>对于Liferay这样的机制没有任何问题，实现的也非常巧妙；但是对于很多web应用系统来说，使用Liferay IFrame Portlet的form方式实现登陆后，虽然可以成功登陆，但是在显示的新页面中，却发现用户信息丢失，或者更准确的说，是session丢失。</div><div> </div><div><span>       </span>其实，这种现象跟Liferay关系不大，而是应用本身决定的。事实上，所有的portal context的iframe 方式，都有可能发生这个情况。</div><div> </div><div><span>       </span>因为很多web应用系统，在执行Login操作的后，习惯性的选择redirect操作，这样会强制浏览器中的显示地址变更为转移的地址。事实上这是个很正确的做法，在正常境况下，不会有任何问题，而且还可以很好的防止页面刷新等所带来的问题。</div><div> </div><div><span>       </span>但是在Liferay的IFrame Portlet中，web应用这样的Redirect操作，造成了调转到新页面后，session变成了一个新的，从而造成放置在原有session中的login user信息丢失。</div><div> </div><div><span>       </span>跟踪并做了如下的一组测试（Liferay和webapp在不同的JVM环境下）：</div><table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; MARGIN: auto auto auto 23.4pt; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"><tbody><tr style="HEIGHT: 15.75pt"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 81pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt" valign="top" width="108"><div><strong>应用</strong></div></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 99pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt" valign="top" width="132"><div><strong>位置</strong></div></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 207pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt" valign="top" width="276"><div><strong>session id</strong></div></td></tr><tr style="HEIGHT: 14.25pt"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 81pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 14.25pt; BACKGROUND-COLOR: transparent" valign="top" width="108"><div>（Liferay）</div></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 99pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 14.25pt; BACKGROUND-COLOR: transparent" valign="top" width="132"><div>执行form post前</div></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 207pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 14.25pt; BACKGROUND-COLOR: transparent" valign="top" width="276"><div>D03E1B828395EF5BCB1063A8290BD254</div></td></tr><tr style="HEIGHT: 14.25pt"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 81pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 14.25pt; BACKGROUND-COLOR: transparent" valign="top" width="108"><div>（APP_A）</div></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 99pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 14.25pt; BACKGROUND-COLOR: transparent" valign="top" width="132"><div>Login操作</div></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 207pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 14.25pt; BACKGROUND-COLOR: transparent" valign="top" width="276"><div>397BB3656E2A12A96CE3F16E0A89C607</div></td></tr><tr style="HEIGHT: 16.5pt"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 81pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 16.5pt; BACKGROUND-COLOR: transparent" valign="top" width="108"><div>（APP_A）</div></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 99pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 16.5pt; BACKGROUND-COLOR: transparent" valign="top" width="132"><div>登陆后的新页面</div></td><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #d4d0c8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #d4d0c8; WIDTH: 207pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 16.5pt; BACKGROUND-COLOR: transparent" valign="top" width="276"><div>58A1054C6EDE4A7D6CFA2FCDBB3E0736</div></td></tr></tbody></table><div><span>       </span>从上面可以明显看出来，redirect之后，web应用的新页面产生了新的sessionid<span>       </span></div><div> </div><div><span>       </span><span style="COLOR: red">解决这个问题，有两种方式</span>，这两种方式都依赖于被liferay portlet纳入的web应用自身。</div><div><span>       </span>方式一：Login操作后，不采用Redirect方式，而是Dispatcher方式。</div><div><span>       </span>方式二：Login操作后，依然采用redirect方式，但将当前的jsessionid赋予新的页面。</div><div> </div><div>Dispatcher方式：</div><div> </div><table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; MARGIN: auto auto auto 32.4pt; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"><tbody><tr style="HEIGHT: 47.25pt"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 360pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 47.25pt; BACKGROUND-COLOR: transparent" valign="top" width="480"><div>ServletContext sc = getServletContext();<br />RequestDispatcher rd = null;<br />rd = sc.getRequestDispatcher("/index.jsp"); <br />rd.forward(request, response);</div></td></tr></tbody></table><div> </div><div>Redirect方式（保持同一个session）：</div><div><span>       </span></div><table style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; MARGIN: auto auto auto 32.4pt; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1"><tbody><tr style="HEIGHT: 47.25pt"><td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 360pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 47.25pt; BACKGROUND-COLOR: transparent" valign="top" width="480"><div>response.sendRedirect(“</div><div style="TEXT-INDENT: 26.25pt">index.jsp<span style="COLOR: blue">;jsessionid=397BB3656E2A12A96CE3F16E0A89C607<span style="COLOR: windowtext">”</span>)</span></div></td></tr></tbody></table><div><span>       </span>有一种情况下，无所谓是否采用Redirect方式，这就是在Liferay和webapp在同一个JVM环境下。</div><img src ="http://www.blogjava.net/esdsoftware/aggbug/69508.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/esdsoftware/" target="_blank">吴名居</a> 2006-09-13 23:54 <a href="http://www.blogjava.net/esdsoftware/articles/69508.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>