我正在开发一个GWT Web应用程序。我有一个登录页面,其中包含一个用于用户名的文本框,一个用于密码的passwordtextbox和一个提交按钮。
现在我希望我的登录页面具有以下功能:当用户再次登录时,在用户名的文本框中,他可以找到以前的所有输入。
目前,我不知道如何做到这一点。我应该寻找什么?这个功能需要什么样的技术?
此功能的一个示例是登录hotmail。它可以记住您之前输入的电子邮件。我不需要我的应用程序来记住密码。
如果有人能给我一个例子,那就太好了。
提前致谢!
祝你好运
答案 0 :(得分:1)
仅仅使用JS是不可能的。您必须为服务器端的文本输入输出HTML(以便浏览器解析的初始响应已包含字段),然后使用GWT对其进行操作。这是GWT邮件列表中类似response中的thread。
我曾经做过一个做同样事情的项目。他们注意到了 密码记得迟到的东西(他们几乎忽略了它)和我 不得不解决这个问题。
经过一番研究后得出的结论是,最好的 保持登录过程尽可能“经典”。按经典我的意思是, HTML不应该生成HTML,而是由服务器编写, POST请求不应该通过Ajax发送,而是使用 正常形式请求。如果不这样做,结果会有所不同 跨浏览器(此列表来自内存):
除非将HTML视为HTML,否则任何浏览器都不会记住用户/通过组合 它解析页面。所以,没有JS生成表单元素。
据我所知,Firefox是唯一提供该功能的浏览器 记住Ajax请求的密码对话框(启发式是相当的 聪明)。其他浏览器需要经典请求。
- 醇>
Chrome记忆密码对话框非常挑剔 仅在重定向后的第一页上显示。如果它发生了 成功登录后进行两次重定向,然后不显示任何对话框。 哦,页面的响应应该是2XX,但那就是 预期
我现在还记得很多其他问题。所以 我的建议是寻找经典的HTML表单/请求。你可以拥有 使用“display:none”形成,并在GWT代码加载后重新定位它 您可以在页面上的任何位置,甚至读取文本输入值和 用它们填充另一个表单元素。但是,正如我所说,提交 不应该通过JS来完成。
您可以更进一步,将登录页面作为经典HTML网页提供,只需在用户登录后,他/她就能看到GWT应用程序。
答案 1 :(得分: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);
}
}
}