HTTPSession с GWT - PullRequest
       17

HTTPSession с GWT

4 голосов
/ 15 января 2011

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

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

Это нормально, этот код?:

Main (на стороне клиента):

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;
      }

1 Ответ

11 голосов
/ 15 января 2011

сеанс в 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());

        }
    });
...