如何记住GWT中的文本框输入历史记录

问题描述:

我正在开发一个GWT Web应用程序。我有一个登录页面,其中包含一个用于用户名的文本框,一个用于密码的passwordtextbox以及一个提交按钮。如何记住GWT中的文本框输入历史记录

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

目前,我没有线索如何做到这一点。我应该寻找什么?这项功能需要什么样的技术?

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

这将是很好,如果有人能给我一个例子。

在此先感谢!

此致敬意

我认为Cookies会诀窍。顺便说一句,我注意到由于某种原因SuggestBox不支持添加鼠标或焦点处理程序,所以我在我的例子中使用了depreciated 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); 
     } 
    } 
} 
+0

它正在工作,但它不完全是我想要的。点击文本框时,我想要显示先前输入的列表。 – NARU

+0

更新了我的答案 – pistolPanties

+0

谢谢,这就是我需要的。是否存在安全问题? – NARU

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

我曾经在一个项目上做过同样的事情。他们注意到密码记得的东西迟到了(他们几乎忽略了它),而我 不得不解决这个问题。

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

  1. 没有浏览器会记住用户名/密码组合,除非它看到HTML作为 它解析页面。所以,没有JS生成表单元素。

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

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

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

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

+0

你能举个例子吗? – NARU

+1

@IKEFORWARD,我现在没有时间了,因为它非常相关。下班后回家后我会试试。基本上,只需将所需的HTML发送到浏览器,在文本输入中添加一些ID,然后在'onModuleLoad'负载中使用'Document.get()。getElementById(String id)'获取这些元素的句柄。 –

+0

谢谢,如果你能给我一个简单的例子,这将是非常有益的。 – NARU