9910

          單飛

             :: 首頁 :: 聯系 :: 聚合  :: 管理
          參考
          http://gwt-ext.com/forum/viewtopic.php?t=1682


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

          @RemoteServiceRelativePath("sessout")
          public interface MyService extends RemoteService {
              public Integer getUserSessionTimeoutMillis();
          }


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

          public interface MyServiceAsync {
              void getUserSessionTimeoutMillis(AsyncCallback async);
          }



          import com.google.gwt.user.server.rpc.RemoteServiceServlet;

          @SuppressWarnings("serial")
          public class MyServiceImpl extends RemoteServiceServlet implements MyService {

              public Object getLoggedInUser() {
                  return getThreadLocalRequest().getSession().getAttribute(EConstants.USER);
              }

              /**
               * Should be the first RPC call from all UIDef*.onModuleLoad()
               *
               * @return java.lang.Integer (-1 if the user session has already timed out,
               *         otherwise, the number of milliseconds)
               */
              public Integer getUserSessionTimeoutMillis() {
                  Integer returnObj = null;
                  if (getLoggedInUser() != null) {
                      returnObj = new Integer(EduConstants.SESSION_TIMEOUT_MILLIS); // milliseconds
                  } else {
                      returnObj = new Integer(-1);
                  }
                  return returnObj;
              }
          }

          public class EConstants {

              public static final String USER = "sessuser";

              public static final int SESSION_TIMEOUT_MILLIS = 1800; // 30 minute
          }


          web.xml

            <servlet>
              <servlet-name>sessServlet</servlet-name>
              <servlet-class>com.chinaedu.edupass.server.MyServiceImpl</servlet-class>
            </servlet>
           
            <servlet-mapping>
              <servlet-name>sessServlet</servlet-name>
              <url-pattern>/ldapmanager/sessout</url-pattern>
            </servlet-mapping>


          public class LManager implements EntryPoint {


              private Timer sessionTimeoutTimer = null;
          private MyServiceAsync service;
          public void onModuleLoad() {

          service = (MyServiceAsync) GWT.create(MyService.class);

                  showLogin();
          }

          private void showLogin() {
                  final LoginDialog dialog = new LoginDialog() {
                      protected void showMainView() {
                          super.showMainView();
                          doShowMainView();
                          // 登錄后開始計時
                          initSessionTimers();
                      }

                  };
                  dialog.setAutoCenter(true);
                  dialog.setIsModal(true);
                  dialog.setShowHeader(false);
                  dialog.setShowToolbar(false);
                  dialog.setEdgeSize(10);
                  dialog.setWidth(300);
                  dialog.setHeight(180);

                  dialog.show();
              }


              private void doShowMainView() {


          /**
               * 客戶端在超時后執(zhí)行跳轉登錄
               *
               * @sessionTimeInMillis Integer
               */
              private void initSessionTimers() {
                  // Allow 30 seconds to get the RPC call constructed and called.
                  sessionTimeoutTimer = new Timer() {
                      public void run() {
                          service.getUserSessionTimeoutMillis(new AsyncCallback() {
                              public void onSuccess(Object result) {
                                  int sessionTimeMillis = ((Integer) result).intValue();
                                  if (sessionTimeMillis == -1) {
                                      // 超時后執(zhí)行跳轉到登錄窗口
                                      displaySessionTimedOut();
                                  } else {
                                      sessionTimeoutTimer.cancel();
                                      initSessionTimers();
                                  }
                              }

                              public void onFailure(final Throwable caught) {
                                  SC.say(LdapI18N.ldapMessages().failed());
                              }
                          });
                      }
                  };
                  // 31 minutes 服務器端設置為30分鐘超時,如果30分鐘沒有操作
                  // 就會返回超時,如果期間有操作,則在等31分鐘后再輪詢
                  sessionTimeoutTimer.schedule(31*60*1000);

              }

              private void displaySessionTimedOut() {
                  SC.say(LI18N.ldapMessages().sessionTimeOut(), new BooleanCallback() {
                      public void execute(Boolean value) {
                          showLogin();
                      }
                  });
              }
          posted on 2011-08-03 18:18 單飛 閱讀(699) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網站導航:
          博客園   IT新聞   Chat2DB   C++博客   博問  
           
          主站蜘蛛池模板: 柯坪县| 固阳县| 故城县| 乳山市| 全南县| 清涧县| 黄骅市| 南通市| 文登市| 慈溪市| 湘西| 富宁县| 社旗县| 白河县| 嘉义县| 那坡县| 深圳市| 涞水县| 任丘市| 荣成市| 金塔县| 雅江县| 长兴县| 旬邑县| 砚山县| 百色市| 永年县| 波密县| 古浪县| 壤塘县| 廉江市| 株洲县| 三亚市| 沅陵县| 江北区| 莱芜市| 怀来县| 宁河县| 吐鲁番市| 汉中市| 安岳县|