HTTPSession с GWT

Я новичок в GWT... Я хотел бы реализовать сеансы в своем веб-приложении. В основном я хочу, чтобы сеанс начинался по нажатию кнопки (обрабатывал событие) и заканчивался нажатием другой кнопки (другой обрабатывал событие ). Возможно?

Как это сделать шаг за шагом?

Этот код подходит?:

Основной (на стороне клиента):

Button b1 = new Button("b1");
b1.addClickHandler(new ClickHandler) {
      public voin onClick(){
              ...
             rpc.setSession(callback); //rpc call the service...

   }
}

Button b2 = new Button("b2");
b1.addClickHandler(new ClickHandler) {
      public voin onClick(){
              ...
             rpc.exitSession(callback);

   }
}

//------------------------------------------------------------------------------------

import com.google.gwt.user.client.rpc.RemoteService;

public interface MySession extends RemoteService {

    public void setSession();

    public void exitSession();
}

//------------------------------------------------------------------------------------

import com.google.gwt.user.client.rpc.AsyncCallback;

public interface MySessionAsync {

    void setSession(AsyncCallback<Void> callback);

    void exitSession(AsyncCallback<Void> callback);

}

//------------------------------------------------------------------------------------

import de.vogella.gwt.helloworld.client.MySession;

public class MySessionImpl extends RemoteServiceServlet implements MySession {

    HttpSession httpSession;
    @Override

    public void setSession() {
        httpSession = getThreadLocalRequest().getSession();

        httpSession = this.getThreadLocalRequest().getSession();
        httpSession.setAttribute("b", "1");

    }

    @Override
    public void exitSession() {
          httpSession = this.getThreadLocalRequest().getSession();
          httpSession.invalidate(); // kill session     
    }

}

Что я делаю, так это подключаюсь с помощью своего веб-приложения к другой веб-странице, если я нажимаю кнопку «Назад» в браузере, который я возвращаю в свое веб-приложение с еще активным сеансом... Как я могу сделать?

Надеюсь, я хорошо объяснил, в чем моя проблема...

*****НОВАЯ ПРОБЛЕМА***:**

Я пытался сделать так...

---клиентская сторона.... ГЛАВНАЯ:

        MyServiceAsync service = (MyServiceAsync) GWT.create(MyService.class);
        ServiceDefTarget serviceDef = (ServiceDefTarget) service;
        serviceDef.setServiceEntryPoint(GWT.getModuleBaseURL()+ "rpc");

        boolean b=false;;

        b=service.checkSession(new AsyncCallback<Boolean>() {

            @Override
            public void onSuccess(Boolean result) {
                // here is the result
                if(result){
                        // yes the attribute was setted
                   }
            }

            @Override
            public void onFailure(Throwable caught) {
                Window.alert(caught.getMessage());

            }
        });

        if (b==false){ // se non esiste una sessione
        RootPanel.get().add(verticalPanel); 
        RootPanel.get().add(etichetta); 
        RootPanel.get().add(nameField);
        RootPanel.get().add(sendButton);
        RootPanel.get().add(horizontalPanel); 

        }

        else{ //esiste già una sessione attiva (pagina da loggato)
            welcome.setText("Ciao "+userCorrect+"!!");
            RootPanel.get().add(verticalPanelLog);
            RootPanel.get().add(etichetta);
            RootPanel.get().add(nameField);
            RootPanel.get().add(cercaLog);
            RootPanel.get().add(horizontalPanel);
        }

////////////////////////////////////////////////////////////////////////

public interface MyServiceAsync {
...

    void exitSession(AsyncCallback<Void> callback);

    void setSession(AsyncCallback<Void> callback);

    void checkSession(AsyncCallback<Boolean> callback); //error!!

////////////////////////////////////////////////////////////////////////

public interface MyService extends RemoteService {
    /.....

    public void setSession();

    public void exitSession();

    public boolean checkSession();

////////////////////////////////////////////////////////////////////////

на стороне сервера:

public boolean checkSession() {

      httpSession = this.getThreadLocalRequest().getSession();

      //se la sessione esiste già
      if (httpSession.getAttribute("b")!= null){
          return true;
      }
      else{ .
          return false;
      }

person JackDaniels    schedule 15.01.2011    source источник


Ответы (1)


сеанс в GWT аналогичен сеансу в сервлете. Разница в сервлете, который вы вызываете
HTTPSession session = request.getSession();

в gwt вы вызываете

HttpServletRequest request = this.getThreadLocalRequest(); для получения запроса, а затем снова request.getSession();

в вашей ситуации вы должны вызывать RPC при нажатии кнопки и управлять сеансом на сервере с предыдущим кодом и вызывать другой RPC при нажатии другой кнопки и аннулировать сеанс. Вот пример;

Button b1 = new Button("b1");
b1.addClickHandler(new ClickHandler) {
    // call RPC and 
   // session = this.getThreadLocalRequest().getSession();
  // session.setAtribute("b", "1");
}


Button b2 = new Button("b2");
b1.addClickHandler(new ClickHandler) {
    // call RPC and 
   // session = this.getThreadLocalRequest().getSession();
  // session.invalidate(); // kill session
}

Эта ссылка может быть вам полезна Использование сеансов сервлетов в GWT

Изменить:

Если вы хотите проверить, является ли сеанс isExist() или нет, попробуйте это

добавить в свой интерфейс boolean test(String attr);
добавить в свой .async добавить void test(String attr, AsyncCallback<Boolean> callback);
добавить в свой .impl

@Override
public boolean test(String attr) {
    return session.getAttribute(attr) != null;
}

и просто позвони

Rpc.test(attribute, new AsyncCallback<Boolean>() {

        @Override
        public void onSuccess(Boolean result) {
            // here is the result
            if(result){
                    // yes the attribute was setted
               }
        }

        @Override
        public void onFailure(Throwable caught) {
            Window.alert(caught.getMessage());

        }
    });
person Community    schedule 15.01.2011
comment
Привет, hilal, спасибо за ваш ответ ... но я ничего не понимаю: HttpSession httpSession = getThreadLocalRequest().getSession() должен быть включен на стороне сервера impl, верно? Если не сложно, не могли бы вы привести пример кнопок вызова RPC внутри? Спасибо - person JackDaniels; 15.01.2011
comment
например... У меня есть интерфейс MySession, MySessionAsync на стороне клиента и MySessionImpl на стороне сервера. Что я должен положить в эти контейнеры? - person JackDaniels; 15.01.2011
comment
да, это должно быть включено в реализацию. вы не можете сделать это на стороне клиента. Для каждого действия сервера вы должны вызывать rpc - person ; 15.01.2011
comment
это ничего не связано с управлением сеансом. Это говорит о том, что это либо неправильная конфигурация, либо попытка взлома. Вы сделали это @RemoteServiceRelativePath(/*greet*/) для своей асинхронной службы и правильно ли ваш web.xml? сопоставление сервлетов? пожалуйста, проверьте эти ошибки. это не связано с управлением сессиями - person ; 15.01.2011
comment
Я не использую @RemoteServiceRelativePath... Я управляю удаленным вызовом процедуры, а другая работает нормально. Но поскольку я сказал, что заблокирована попытка доступа к интерфейсу «de.vogella.gwt.helloworld.client.MyService», который не реализован в «de.vogella.gwt.helloworld.server.MySessionImpl», это либо неправильная конфигурация, либо попытка взлома. когда MySessionImpl реализуется MySession?? (MyService - это другой вызов..) - person JackDaniels; 17.01.2011
comment
выполните следующие действия, указанные в vogella.de/articles/GWT/article.html создать простое приложение в gwt и не забыть @RemoteServiceRelativePath и в web.xml - person ; 17.01.2011
comment
Если я использую один rpc, он работает. Но если я нажму первую кнопку, а затем подключусь к внешней веб-странице через URL-адрес моего веб-приложения, а затем вернусь к кнопке «Назад» в браузере, я потерял сеанс (т.е. сеанс все еще активен... я), но в моем коде говорит мне, что я все равно должен войти в систему (чего не должно происходить). Я думаю, что это обратно к точке входа в веб-приложение (где мне войти в систему). - person JackDaniels; 17.01.2011
comment
В методе onModuleLoad() задаю начальную панель. Могу ли я проверить, существует ли сеанс или нет? - person JackDaniels; 17.01.2011
comment
отлично... и последнее... Я бы хотел, чтобы они вернули логическое значение с сервера RPC. Но не подведи меня, почему? Я имею в виду, что я хочу сделать: если логическое значение b = true (если нет активной сессии): панель вставить инициалы. b = false иначе если (вставить панель с террасы). Можешь мне помочь? Большое Вам спасибо - person JackDaniels; 17.01.2011
comment
определите метод, который возвращает логическое значение в вашем интерфейсе. логический isSessionExists(); Например. тогда вы можете сделать это с помощью callin rpc и asynccallback‹Boolean result›. после этого делайте все, что хотите, если (результат) сделайте это еще сделайте это - person ; 17.01.2011
comment
У меня ошибка... Я не возвращаю асинхронный вызов... почему? Выкладываю свою новую проблему... (извините, если еще не принял ответ)... - person JackDaniels; 17.01.2011
comment
вставьте это в свой интерфейс boolean isSessionExist(); после этого реализуйте его на сервере .impl, а затем клиентский вызов как обычный rpc, который принимает вывод/результат с асинхронным обратным вызовом «логический результат». это все. Я отвечу на ваш другой вопрос через 15 минут. теперь я должен вернуться к своей работе :) - person ; 17.01.2011
comment
Если я вставлю логическое значение checkSession (обратный вызов AsyncCallback‹Boolean›); в моем асинхронном интерфейсе у меня ошибка!! говорит мне быть недействительным ... - person JackDaniels; 17.01.2011
comment
В вашем интерфейсе: boolean test(); в вашем асинхронном тесте: void test (обратный вызов AsyncCallback‹Boolean›); в вашем логическом тесте .impl() {return session.getAttribute(attribute) != null;) - person ; 17.01.2011
comment
PS: но я могу создать экземпляр ответа? например, rpc.checkSession boolean b = (обратный вызов)? Мне нужно это... спасибо за помощь, Хилал... мне не хватает только этого... :( - person JackDaniels; 17.01.2011
comment
Большое спасибо Хилал...ты лучший!! - person JackDaniels; 17.01.2011
comment
пожалуйста. меня радует, что ты узнаешь что-то новое - person ; 18.01.2011