首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带GWT的HTTPSession

带GWT的HTTPSession
EN

Stack Overflow用户
提问于 2011-01-15 08:27:38
回答 1查看 24.5K关注 0票数 4

我是新来的..。我想在我的Web中实现会话,基本上,我希望会话从单击按钮(处理事件)开始,并在单击另一个按钮(其他处理事件)时结束。有可能吗?

如何一步一步地做?

这个密码可以吗?:

Main (客户端):

代码语言:javascript
运行
复制
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);

   }
}

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

代码语言:javascript
运行
复制
import com.google.gwt.user.client.rpc.RemoteService;

public interface MySession extends RemoteService {

    public void setSession();

    public void exitSession();
}

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

代码语言:javascript
运行
复制
import com.google.gwt.user.client.rpc.AsyncCallback;

public interface MySessionAsync {

    void setSession(AsyncCallback<Void> callback);

    void exitSession(AsyncCallback<Void> callback);

}

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

代码语言:javascript
运行
复制
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     
    }

}

我所做的是将我的Web应用程序连接到另一个网页,如果我单击浏览器的后退按钮,然后返回到我的web应用程序,而会话仍然活着.我该怎么做?

我希望我能很好地解释我的问题..。

新问题*

我试过这样做..。

--客户端.主营:

代码语言:javascript
运行
复制
        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);
        }

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

代码语言:javascript
运行
复制
public interface MyServiceAsync {
...

    void exitSession(AsyncCallback<Void> callback);

    void setSession(AsyncCallback<Void> callback);

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

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

代码语言:javascript
运行
复制
public interface MyService extends RemoteService {
    /.....

    public void setSession();

    public void exitSession();

    public boolean checkSession();

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

server-side:

代码语言:javascript
运行
复制
public boolean checkSession() {

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

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-15 09:16:12

GWT中的会话类似于servlet中的会话。不同之处在于您调用的servlet

HTTPSession session = request.getSession();

在你的电话里

HttpServletRequest request = this.getThreadLocalRequest();获取请求,然后再获得request.getSession();

在您的情况下,您应该在单击该按钮时调用RPC,并将前面的代码管理服务器上的会话,并在单击另一个按钮并使会话无效时调用另一个RPC。这是一个例子;

代码语言:javascript
运行
复制
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中使用Servlet会话有帮助。

编辑:

如果要测试会话isExist()是否尝试以下操作

添加到您的接口boolean test(String attr);

添加到.async中添加void test(String attr, AsyncCallback<Boolean> callback);

添加到您的.impl

代码语言:javascript
运行
复制
@Override
public boolean test(String attr) {
    return session.getAttribute(attr) != null;
}

然后打电话

代码语言:javascript
运行
复制
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());

        }
    });
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4698658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档