Liferay Portal額外研究(三):IFrame Portlet的session丟失問題解決

來源:互聯網
上載者:User
  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環境下。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.