Пусть браузер сохраняет значения имени пользователя/пароля в login <form>?

У меня есть приложение GWT, и мне нужна форма входа в систему. Я хочу, чтобы браузер сохранил имя пользователя и пароль для пользователя. Я считаю, что мне нужно использовать "регулярную" форму для этого (а не одну, созданную GWT). Поэтому я сделал простую форму:

<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?
    }
});

Кто-нибудь знает, как заставить это работать?

Ответ 1

Это зависит от того, как выглядит ваша форма (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()();
        };
    }-*/;
}

Ответ 2

Во время поиска того же я наткнулся на этот абзац в вики google-web-toolkit-инкубатора:

автозаполнение и GWT

Некоторые браузеры предлагают возможность сохранять комбинации имени пользователя и пароля, чтобы они автоматически заполнялись для пользователя при следующем посещении страницы. Однако обычно это работает только при наличии двух полей ввода (один из паролей типа), и только если эти поля ввода загружаются вместе с главной страницей и не добавляются позже через javascript (что и делает GWT).

Чтобы заставить эти поля ввода отображаться, введите их в проект HTML в невидимый div. Затем в GWT вместо создания TextBox и PasswordTextBox сделайте div видимым и зачитайте значения с помощью DOM. библиотека.

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

Ответ 3

:) просто установите тип входа в систему, чтобы "отправить", и вставьте свои входы и кнопки в панель форм!