GWT - 需要的提示 - 检查并设置会话参数。这是正确的方法吗?

时间:2010-11-19 17:34:23

标签: session gwt

我使用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;
    }
}

1 个答案:

答案 0 :(得分:1)

看起来它应该有效。我在GWT上做了很多工作,虽然我经常放弃使用RemoteServiceServlet来支持通过JSON来回传递数据。

但有一些建议。当您在同一个班级中调用方法或字段时,您不需要包含this关键字。它不会造成伤害,但往往会使您的代码变得比它需要的更长。如果你发现它让你的东西更清晰,请随意保留它。

此外,除非您有实际使用请求的方法,否则您不需要创建请求对象;你可以做到

session = getThreadLocalRequest().getSession();

最后的建议:由于你在多个方法中使用会话,所以立即初始化它可能是一个好主意;因此,您可以只编写isSetSession(),或者在类的构造函数中初始化它,而不是在HttpSession session = getThreadLocalRequest().getSession();中初始化它。就目前而言,如果您恰好在checkLogin()之前致电isSetSession(),那么您将获得NullPointerException,因为session尚未初始化。