我使用GWT在我的Web应用程序上进行了一种身份验证。所以我在GWTServiceImpl类中创建了这些函数:
public class PageMenuLogin extends FlowPanel {
public PageMenuLogin() {
PageMenuLogin.getService().isSetSession(new AsyncCallback<String>() {
@Override
public void onFailure(Throwable caught) {
InlineLabel err=new InlineLabel();
err.setText("Errore Di Connessione");
PageMenuLogin.this.add(err);
}
@Override
public void onSuccess(String result) {
if(result.compareTo("")==0) {
designLogin();
} else {
designLogout(result);
}
}
});
}
public final void designLogin() {
final InlineLabel menu_err=new InlineLabel("");
menu_err.setStyleName("menu_err");
this.add(menu_err);
Button menu_login_button=new Button("Login");
this.add(menu_login_button);
menu_login_button.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
getService().checkLogin("nickname", "password", new AsyncCallback<Boolean>() {
@Override
public void onFailure(Throwable caught) {
menu_err.setText("Comunicazione Fallita");
}
@Override
public void onSuccess(Boolean result) {
if (result) {
// I LOAD THE PROFILE PAGE
} else {
menu_err.setText("Username e password non validi");
}
}
});
}
});
}
}
********************************************************************************
public class GWTServiceImpl extends RemoteServiceServlet implements GWTService {
HttpServletRequest request;
HttpSession session;
public String isSetSession() {
this.request = this.getThreadLocalRequest();
this.session=this.request.getSession();
if(this.session.getAttribute("nickname")==null) {
return "";
} else {
return (String)this.session.getAttribute("nickname");
}
}
public boolean checkLogin(String username, String password) {
if("i check on the database if the user exist") {
this.session.setAttribute("nickname", value);
return true;
}
return false;
}
}
在客户端,我调用GWTServiceImpl函数(服务器端),我检查返回值,然后执行一些操作。
这是在GWT上使用会话的正确方法吗?任何建议/提示/帮助将不胜感激:)
谢谢你的时间!!!
修改
新GWTServiceImpl:
public class GWTServiceImpl extends RemoteServiceServlet implements GWTService {
HttpSession session;
public String isSetSession() {
HttpSession session=getThreadLocalRequest().getSession();
if(session.getAttribute("nickname")==null) {
return "";
} else {
return (String)session.getAttribute("nickname");
}
}
public boolean checkLogin(String nickname, String password) {
HttpSession session=getThreadLocalRequest().getSession();
Database mydb=Configuration.getDatabase();
mydb.connetti();
// faccio md5 ed escape
String log_check_user=nickname;
String log_check_pass=password;
// controllo che l'utente esista
ArrayList<String[]> db_result=null;
db_result=mydb.selectQuery("SELECT nickname FROM users WHERE nickname='"+log_check_user+"' AND password='"+log_check_pass+"'");
mydb.disconnetti();
if(!db_result.isEmpty()) {
session.setAttribute("nickname", nickname);
return true;
}
return false;
}
public boolean checkLogout() {
HttpSession session=getThreadLocalRequest().getSession();
session.invalidate();
return true;
}
}
答案 0 :(得分:1)
看起来它应该有效。我在GWT上做了很多工作,虽然我经常放弃使用RemoteServiceServlet来支持通过JSON来回传递数据。
但有一些建议。当您在同一个班级中调用方法或字段时,您不需要包含this
关键字。它不会造成伤害,但往往会使您的代码变得比它需要的更长。如果你发现它让你的东西更清晰,请随意保留它。
此外,除非您有实际使用请求的方法,否则您不需要创建请求对象;你可以做到
session = getThreadLocalRequest().getSession();
最后的建议:由于你在多个方法中使用会话,所以立即初始化它可能是一个好主意;因此,您可以只编写isSetSession()
,或者在类的构造函数中初始化它,而不是在HttpSession session = getThreadLocalRequest().getSession();
中初始化它。就目前而言,如果您恰好在checkLogin()
之前致电isSetSession()
,那么您将获得NullPointerException
,因为session
尚未初始化。