参考
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() {
}
/**
* 客户端在超时后执行跳转登录
*
* @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) {
// 超时后执行跳转到登录窗口
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();
}
});
}