GWT - Tips Needed - Проверьте и установите параметр в сеансе. Это правильный путь? - PullRequest
0 голосов
/ 19 ноября 2010

Я сделал своего рода аутентификацию в своем веб-приложении, используя GWT.Поэтому я делаю эти функции в классе 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 Ответ

1 голос
/ 19 ноября 2010

Похоже, это должно работать.Я много работаю с GWT, хотя часто отказываюсь от использования RemoteServiceServlet в пользу передачи данных назад и вперед через JSON.

Несколько предложений.Когда вы вызываете метод или поле в том же классе, вам не нужно включать ключевое слово this.Это не больно, но делает ваш код длиннее, чем нужно.Не стесняйтесь держать это, хотя, если вы обнаружите, что это проясняет ситуацию для вас.

Кроме того, если у вас нет методов, которые фактически используют запрос, вам не нужно создавать объект запроса;Вы можете просто сделать

session = getThreadLocalRequest().getSession();

Последнее предложение: поскольку вы используете сеанс в нескольких методах, было бы неплохо сразу же инициализировать его;Таким образом, вместо инициализации в isSetSession(), вы можете просто написать HttpSession session = getThreadLocalRequest().getSession(); или инициализировать его в конструкторе класса.В настоящее время, если вам случится позвонить checkLogin() до isSetSession(), вы получите NullPointerException, поскольку session еще не инициализирован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...