2012-01-30 90 views
4

我是gwt新手,我使用gwt創建登錄頁面,我需要與會話管理相關的幫助。GWT平臺登錄+會話管理

所有答案在這裏已經給出,介紹瞭如何在服務器端管理會話, 我需要使用在客戶端的會話(瀏覽器會話),酷似與JSP文件: session.setAttribute("UserName", username);

任何一個可以提供清晰如何實現這個完整的例子(記住我是gwt的新手)。 我看了這個教程: http://code.google.com/p/google-web-toolkit-incubator/wiki/LoginSecurityFAQ 這並沒有幫助我,因爲它沒有解釋如何使用瀏覽器的會話。

謝謝。

回答

8

「我需要在客戶端(瀏覽器會話)使用與JSP文件完全相同的會話:session.setAttribute(」UserName「,username);」

我想糾正你的錯誤觀念。以下不是瀏覽器端代碼,而不是瀏覽器端會話。它是服務器端代碼,管理服務器端會話信息。

session.setAttribute("UserName", username); 

你會傳送這個服務器端的會話信息到客戶端在你的JSP,例如:

<script> 
var username = "<%=username%>"; 
</script> 

或者,

<script> 
var username = '<%=session.getAttribute("UserName")%>'; 
</script> 

作爲一個經驗豐富的JSP程序員,你會實現HTML/Javascript(由JSP生成)與JSP本身之間的解耦。而對於JSP所面臨的侷限性,就是你轉向GWT的原因。

JSP生成的客戶端和GWT之間的相似性生成的客戶端

  • 偶爾(也許經常)程序員錯誤服務器端代碼作爲客戶端代碼,反之亦然。就像你一樣。

  • 都生成發送到客戶端執行的JavaScript和HTML元素。

  • 無論你用JSP生成的javascript做什麼,GWT客戶端Java源代碼都無法做到。

  • 無論由JSP生成的客戶端代碼需要做什麼,也需要由GWT客戶端代碼完成。

  • 您可以將會話信息嵌入到HTTP標頭,POST或GET參數中。

  • 您需要客戶端維護會話信息,主要是以cookie的形式。

  • 在某些情況下,jsessionid cookie不是由服務器的響應設置的。

  • 您的servlet或其容器可以爲JSESSIONID生成http set-cookie標頭。

  • 由於request.getSession(),servlet可以控制何時創建cookie頭。

JSP之間的差別生成的客戶端和GWT生成的客戶端

  • JSP生成的客戶端對每個請求/響應刷新。因此,您可以在客戶端和服務器之間爲每個請求/響應傳輸更改和數據。

  • GWT生成的客戶端對客戶端來說是持久的,而不是刷新的。正因爲如此,你正在轉向GWT。

  • 這種刷新差異對理解GWT編碼差異比JSP更加重要。

  • JSP中的所有Java代碼都是服務器端代碼。在JSP中,沒有用Java編寫的客戶端代碼。甚至用於生成HTML/javascript的Java代碼都是服務器端代碼。

  • 所有客戶端Java代碼被翻譯/編譯成Javascript。所以GWT Java代碼實際上是「編譯器端」代碼。

。在GWT客戶機 - 服務器之間的通信

手段

  • 不要忘了使用Dictionary類客戶端代碼來發送你的靜態設置GWT應用在救援人員到場託管文件中定義JavaScript對象。您可以將JavaScript對象設置爲變量,並且在加載gwt模塊後,它們將可以由Dictionary類讀取。

  • 不要忘了,您可以使用JSP來生成GWT託管文件 - 以便您可以創建不同的字典讀物提供的不同行爲,您可以針對每次調用您的應用程序進行個性化處理。

  • 但是,你不應該放置在主機文件中的會話ID或認證信息。因爲即使由JSP動態生成,它在持久GWT客戶端上實際上也是靜態的。

  • 您可以使用Window.Location.reload()無謂地刷新你的GWT客戶,以防萬一你還愛JSP的刷新效果。

  • GWT-RPC

  • RequestBuilder

  • RequestFactory

  • REST和REST-RPC

  • 腳本包括(穿越SLD-SOP邊界)

由於技術的異步性,所有客戶端 - 服務器通信都需要GWT客戶端提供回調。

看看http://google-web-toolkit.googlecode.com/svn/javadoc/2.4/com/google/gwt/http/client/RequestBuilder.html(或查看它在GWT的javadoc您的個人副本)。

...您可以在其中定義設置並獲取標題。您的服務器端必須與客戶端一致使用哪個頭名稱。

您不需要依賴傳統的JEE會話來「維護會話」。你可以設計你自己的令牌框架。或者使用現有的OAuth或OpenId。

在各種情況下,您不會在服務器響應中設置會話cookie。

在某些情況下,你可能需要編寫一個應用程序GWT時,完全放棄使用傳統的JEE會話。

您應該考慮使用REST或REST-RPC,因爲我試圖將其記錄下來(在蝸牛的速度)中:http://h2g2java.blessedgeek.com/2011/11/gwt-with-jax-rs-aka-rpcrest-part-0.html

REST不需要您維護會話cookie。在我看來,GWT最適合於REST-RPC。

你可以瀏覽過以前的帖子在那裏,那裏還有其他形式與GWT客戶端 - 服務器COMM的解釋。

6

如果您的意思是在客戶端控制HttpSession的實例,則只能在客戶端控制會話,因爲它位於服務器端。爲了控制會話,您必須使用異步回調或使用其他技術調用服務器端。 閱讀本教程:Communicating with a Server in GWT 在服務器端實現,你可以任意屬性設置爲會話

HttpSession session = this.getThreadLocalRequest().getSession(); 
session.setAttribute("UserName", userName); 

或者,如果你的意思是Client side web sessions,你可以用Cookies控制它們。

0

沒有瀏覽器會話這樣的事情。這裏是你可以做的:

  1. 實現一個GWT RPC,它ping服務器,從服務器檢索會話超時。
  2. 在超時期間運行的客戶端啓動一個定時器。
  3. 每次發生服務呼叫時重置計時器。