如何记住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);
}
}
}
这是不可能的仅使用JS。您必须输出文本输入服务器端的HTML(以便浏览器分析的初始响应已包含字段),然后使用GWT操作它。这是我的response在GWT邮件列表中的类似thread。
我曾经在一个项目上做过同样的事情。他们注意到密码记得的东西迟到了(他们几乎忽略了它),而我 不得不解决这个问题。
经过一番研究,我得出的结论是最好 保持登录过程尽可能“古典”。我的意思是, 不应该由JS生成HTML,而应由服务器编写, ,POST请求不应通过Ajax发送,而应使用 标准格式请求。如果你不这样做,结果可能会有所不同跨浏览器 (这个列表是从内存中):
没有浏览器会记住用户名/密码组合,除非它看到HTML作为 它解析页面。所以,没有JS生成表单元素。
据我所知,Firefox是唯一提供了 记住Ajax请求密码对话框的浏览器(启发式智能相当于 )。其他浏览器需要经典请求。
Chrome非常挑剔,因为记住密码对话框 仅在重定向后的第一页显示。如果发生 成功登录后执行两次重定向,则不显示对话框。 哦,页面的响应应该是2XX,但这应该是 的预期。
还有很多其他问题我现在不记得了。所以 我的建议是去经典的HTML表单/请求。您可以在 表单中显示“display:none”,然后GWT代码在页面上重新定位 任何位置,甚至可以读取文本输入值,并使用 填充另一个表单元素。但是,正如我所说,提交 不应该通过JS完成。
你可以更进一步,并提供登录页面作为经典的HTML网页,并在用户登录后,她/他将能够看到GWT应用程序。
它正在工作,但它不完全是我想要的。点击文本框时,我想要显示先前输入的列表。 – NARU
更新了我的答案 – pistolPanties
谢谢,这就是我需要的。是否存在安全问题? – NARU