让浏览器将用户名/密码值保存在登录?

问题描述:

我有一个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? 
    } 
}); 

有谁知道如何得到这个工作?

在搜索同一我碰到这一段偶然在谷歌的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

这取决于你的形式(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

:)只是设置你的登录按钮类型为“提交” &把你输入&按钮形式面板!