2010-05-06 111 views
13

我有一個GWT應用程序,並且需要用戶登錄表單。我想讓瀏覽器保存用戶的用戶名和密碼。我相信我需要爲此使用「常規」表單(而不是由GWT生成的表單)。所以我做了一個簡單的表格:讓瀏覽器將用戶名/密碼值保存在登錄<form>?

<form id="myform"> 
    <input type="text" name="username"> 
    <input type="password" name="password"> 
    <input type="submit" value="Login" /> 
</form> 

現在,我想打斷提交過程中,搶用戶名/密碼,通過RPC做登錄,但瀏覽器保存這些字段的內容對於用戶來說,如果他們想要。 GWT開發板上有一些關於它的帖子,不確定哪一個可以工作,因爲它們都不適合我。我認爲它應該看起來像:

FormPanel form = FormPanel.wrap(Document.get().getElementById("myform"), false); 
form.setAction("javascript:;"); 
form.addSubmitHandler(new SubmitHandler() { 
    public void onSubmit(SubmitEvent event) { 
     // Do my RPC call here? 
     // User should have been prompted to save password already now? 
    } 
}); 

有誰知道如何得到這個工作?

回答

5

在搜索同一我碰到這一段偶然在谷歌的Web的工具包孵化的維基:

自動完成和GWT

某些瀏覽器提供的存儲選項用戶名/密碼組合,以便下次訪問該頁面時自動爲用戶填寫。但是,通常這隻有在有兩個輸入框(一種類型的密碼)時纔有效,並且只有當這些輸入框與主頁面一起加載,並且以後不通過JavaScript(這是GWT所做的)加載。

爲了強制顯示這些輸入框,將它們填充到項目的HTML中的一個不可見的div中。然後,在GWT中,不是創建一個TextBox和一個PasswordTextBox,而是使div可見並使用DOM讀出值。圖書館。

見:http://code.google.com/p/google-web-toolkit-incubator/wiki/LoginSecurityFAQ

+0

對我不起作用 – 2012-08-31 09:27:40

+0

@jkremser哪個瀏覽器? – funkybro 2012-09-03 11:00:04

+0

FF和Chrome。問題是我使用我自己的用Java編寫的認證方法,所以我必須在點擊提交按鈕後調用這個方法。 我已經試過許多方法: 我不想用「醜陋」的純HTML登錄表單,所以我用了GWT一個,並點擊登錄我的用戶名和密碼複製到HTML隱藏的表單和人爲點擊後該表單上的提交按鈕。這種形式運行,然後通過JSNI在Java登錄方法 - > din't工作(broswer並未暗示密碼保存) – 2012-09-11 11:15:57

12

這取決於你的形式(myform)的樣子,因爲每個瀏覽器使用它自己的試探,發現有憑據的潛在的登錄表單儲存器(Chrome例如需要一個動作在當前屬性標記http://code.google.com/p/chromium/issues/detail?id=29513)。所以我們所做的就是Google爲我們的應用必須支持的每個瀏覽器的記憶憑證功能。結果是以下表單元素:

<form id="login-form" style="display:none" action="login"> 
    <input type="text" tabindex="0" name="username" id="login-username"> 
    <input type="password" tabindex="0" name="password" id="login-password"> 
    <input style="position: absolute; left: -9999px; width: 1px; height: 1px;" type="submit"> 
</form> 

也可以爲您工作。

編輯

這裏爲我的作品爲例(只嘗試FF版本14.x)。不要忘記從表單標籤中刪除display:none

public class Starter implements EntryPoint { 

    private static final String FORM_ID = "login-form"; 
    private static final String USER_ID = "login-username"; 
    private static final String PASSWORD_ID = "login-password"; 

    @Override 
    public void onModuleLoad() { 
     injectLoginFunction(); 
     TextBox fUsername = TextBox.wrap(DOM.getElementById(USER_ID)); 
     fUsername.setStyleName("gwt-TextBox"); 
     PasswordTextBox fPassword = PasswordTextBox.wrap(DOM.getElementById(PASSWORD_ID)); 
     fPassword.setStyleName("gwt-PasswordTextBox"); 
     FormPanel fLoginForm = FormPanel.wrap(DOM.getElementById(FORM_ID), false); 
     fLoginForm.setAction(""); 
     fLoginForm.addSubmitHandler(new SubmitHandler() { 

      @Override 
      public void onSubmit(SubmitEvent event) { 
       Window.alert("test"); 
      } 
     }); 
     fLoginForm.getElement().setAttribute("onsubmit", "login();return false;"); 
    } 

    private static void doLogin() { 
     Window.alert("test"); 
    } 

    private static native void injectLoginFunction() /*-{ 
     $wnd.login = function() { 
      @test.client.Starter::doLogin()(); 
     }; 
    }-*/; 
} 
+0

行動=「登陸」的手段,用戶會被重定向到http://本地主機:7080/coregui /登錄用戶名= XY和密碼= YX,我不希望添加其他的servlet來處理這個問題。 – 2012-09-11 11:42:49

+0

稍後,您可以將action屬性修改爲所需的值,對於瀏覽器來說重要的僅僅是頁面加載時DOM中的內容。 – z00bs 2012-09-11 13:42:30

+0

你有什麼特別的?你有任何代碼工作的例子嗎?我試過「javascript:window.doSubmitForm();」 doSubmitForm是我的Java函數,可以通過JSNI進行登錄邏輯,但它可以工作,但瀏覽器不提供保存密碼 – 2012-09-11 17:44:16

0

:)只是設置你的登錄按鈕類型爲「提交」 &把你輸入&按鈕形式面板!

相關問題