【问题标题】:How to remember textbox input history in GWT如何在 GWT 中记住文本框输入历史
【发布时间】:2011-08-18 05:45:49
【问题描述】:

我正在开发一个 GWT Web 应用程序。我有一个登录页面,其中一个用于用户名的文本框、一个用于密码的密码文本框和一个提交按钮。

现在我希望我的登录页面有这个功能:当用户再次登录时,在用户名的文本框中,他可以找到所有以前的输入。

目前,我不知道该怎么做。我应该寻找什么?这个功能需要什么样的技术?

这个功能的一个例子是hotmail的登录。它可以记住您以前输入的电子邮件。我不需要我的应用程序来记住密码。

如果有人能举个例子就好了。

提前致谢!

最好的问候

【问题讨论】:

    标签: gwt


    【解决方案1】:

    我认为Cookies 可以解决问题。顺便说一句,由于某种原因,我注意到 SuggestBox 不支持添加鼠标或焦点处理程序,因此我在示例中使用了已弃用的 focusListener。正确的做法是使用 FocusPanel 来包装 SuggestBox 以捕获焦点事件。

    public class LoginExample implements EntryPoint {
    
        static long forgetMeIn = 1000 * 60 * 60 * 24 * 365 * 30; //30 years
        MultiWordSuggestOracle oracle;
        SuggestBox suggestBox;
        Button loginButton;
        Button showCookieButton;
    
        public void onModuleLoad() {
            oracle = new MultiWordSuggestOracle();
            suggestBox = new SuggestBox(oracle);
            updateSuggestBox();
            suggestBox.addFocusListener(new FocusListener() {
                @Override
                public void onLostFocus(Widget sender) {
                }               
                @Override
                public void onFocus(Widget sender) {
                    suggestBox.showSuggestionList();
                }
            });
            loginButton = new Button("Login");
            loginButton.addClickHandler(new ClickHandler() {
                @Override
                public void onClick(ClickEvent event) {
                    String username = suggestBox.getValue();
                    if (username!=null && !username.equals("") && !cookieContains(username)){
                        addToCookie(username);
                        suggestBox.setValue("");
                        updateSuggestBox();
                        Window.alert("Next time I will remember " + username);
                    }
                }
            });
            showCookieButton = new Button("ShowCookie");
            showCookieButton.addClickHandler(new ClickHandler() {
                @Override
                public void onClick(ClickEvent event) {
                    Window.alert(LoginExample.this.getUsernames().toString());
                }
            });
            RootPanel.get().add(suggestBox);
            RootPanel.get().add(loginButton);
            RootPanel.get().add(showCookieButton);
        }
    
        private boolean cookieContains(String s){
            boolean contains = false;
            String users = Cookies.getCookie("usernames");
            if (users!=null){
                for (String username : users.split(":")){
                    if (username.equals(s))
                        contains= true;
                }
            }
            return contains;
        }
        private void addToCookie(String username){
            String users = Cookies.getCookie("usernames");
            if (users!=null)
                Cookies.setCookie("usernames", users+":"+username, new Date(new Date().getTime() + forgetMeIn));
            else
                Cookies.setCookie("usernames", username, new Date(new Date().getTime() + forgetMeIn));
        }
        private List<String> getUsernames(){
            ArrayList<String> usernames = new ArrayList<String>();
            String users = Cookies.getCookie("usernames");
            if (users!=null){
                for (String username : users.split(":")){
                    usernames.add(username);
                }
            }
            return usernames;
        }
    
        private void updateSuggestBox(){
            oracle.clear();
            List<String> usernames = getUsernames();
            oracle.setDefaultSuggestionsFromText(usernames);
            for (String username : usernames){
                oracle.add(username);
            }
        }
    }
    

    【讨论】:

    • 它工作正常,但不是我想要的。我希望在单击文本框时,显示以前输入的列表。
    • 谢谢,这正是我需要的。是否涉及安全问题?
    • Cookies 存储在客户端的文件系统中,因此很容易访问,所以只要您不存储密码等有价值的信息(您不是),您应该没问题。如果您打算将其用于生产,您应该考虑创建比“用户名”更独特的 cookie 名称。此外,如果您的应用程序允许在用户名中使用字符“:”,则更简洁的方法是使用 base64 编码将用户名存储在 cookie 中,以便诸如“My:Name:is:Mike”之类的用户名不会引起问题。这个例子只是一个指针,希望对您有所帮助
    【解决方案2】:

    仅使用 JS 是不可能的。您必须在服务器端输出文本输入的 HTML(以便浏览器解析的初始响应已经包含字段),然后使用 GWT 对其进行操作。这是我在 GWT 邮件列表中类似 thread 中的 response。

    我曾经参与过一个做同样事情的项目。他们注意到 密码记得很晚的东西(他们几乎忽略了它)和我 必须解决这个问题。

    经过一些研究,我得出的结论是,最好 尽可能保持登录过程“经典”。我的意思是经典, HTML不应该由JS生成,而是由服务器编写, 并且 POST 请求不应通过 Ajax 发送,而应使用 正常形式的请求。如果你不这样做,结果会有所不同 跨浏览器(此列表来自内存):

    1. 除非浏览器将 HTML 视为 它解析页面。所以,没有 JS 生成表单元素。

    2. 据我所知,Firefox 是唯一提供 记住 Ajax 请求的密码对话框(启发式相当 聪明的)。其他浏览器需要一个经典请求。

    3. Chrome 非常挑剔,因为记住密码对话框是 仅在重定向后的第一页上显示。如果发生这种情况 成功登录后进行两次重定向,然后不显示任何对话框。 哦,页面的响应应该是2XX,但那是 预计。

    还有很多其他问题我现在不记得了。所以 我的建议是使用经典的 HTML 表单/请求。你可以拥有 带有“display:none”的表单并在 GWT 代码加载后重新定位它 在页面上的任何位置,甚至读取文本输入值和 用它们填充另一个表单元素。但是,正如我所说,提交 不应该通过JS来完成。

    您可以更进一步,将登录页面提供为经典的 HTML 网页,在用户登录后,她/他将能够看到 GWT 应用程序。

    【讨论】:

    • @IKEFORWARD,我现在没有时间,因为它很复杂。我下班后回家试试。基本上,只需将所需的 HTML 发送到浏览器,在文本输入中添加一些 ID,然后在您的 onModuleLoad 加载中使用 Document.get().getElementById(String id) 获取这些元素的句柄。
    • 谢谢,如果你能给我一个简单的例子,那将非常有帮助。
    • 出于安全原因,我不会使用 cookie。另外,我认为模仿原生的自动完成功能会更难。
    • 我真正建议的解决方案是使用经典登录页面,因为某些浏览器不会记住输入的凭据,除非有表单提交,即不是 Ajax 请求。所以,用经典的表单构建一个经典的 HTML 页面。通过 POST 进行身份验证,授权用户并然后向她/他显示 GWT 应用程序。这是最简单的解决方案,恕我直言,并不优雅。
    猜你喜欢
    • 2013-07-22
    • 2023-02-26
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 2020-04-05
    • 2013-07-02
    • 1970-01-01
    相关资源
    最近更新 更多