我正在研究GWT。 在我的应用程序中,我想在 2 分钟后添加会话超时,当不执行任何操作(包括鼠标事件)时。
我编写了一个类,其中使用了 GWT 会话对象。
public static boolean ValidSession(HttpSession session) {
boolean aResult = true;
logger.debug("Start of ValidSession");
try
{
if(session!=null )
{
String strUserInf="";
strUserInf=(String)session.getAttribute("userInf");
logger.debug("User Inf in session is: " + strUserInf);
if(strUserInf==null || strUserInf.trim().equals(""))
{
logger.debug("User Info blank");
aResult =false;
}
}
else
{
logger.debug("SessionNull");
aResult=false;
}
}
catch (Exception e)
{
logger.error("Exception in ValidSession: ", e);
aResult = false;
}
logger.debug("End of isSessionValid");
return aResult;
}
public static void TimeUpdate(HttpSession session){
session.setAttribute("lastAccessed", String.valueOf(session.getLastAccessed()));
System.out.println("lastAccessed "+ session.getAttribute("lastAccessed"));
}
但它仅在 RPC 调用时重置计时器。我也想检测鼠标移动。
任何人都可以提出解决方案吗?提前谢谢。
您可以在模块加载时执行这样的代码。
创建一个每 2 分钟运行一次的计时器,并设置会话过期标志:
private static Timer SESSION_TIMER = new Timer() {
public void run() {
SessionFactory.putValue(SesisonKey.SESSION_EXPIRED,
true);
}
};
使用此方法调用此方法 续订计时器会话,如下所示 在模块加载时:
public static void renewTimer() {
if (CLIENT_SIDE_TIMER != null) {
CLIENT_SIDE_TIMER.cancel();
SessionFactory.getClientInstance().put(
SesisonKey.SESSION_EXPIRED, false);
//CLIENT_SIDE_TIMER.schedule(250 * 60 * 20);
//1 Minute = 60000 Milliseconds
CLIENT_SIDE_TIMER.schedule(60000 * 2);
}
}
NativePreviewHandler 处理程序捕获鼠标事件,并检查会话是否已过期或未标记。
final NativePreviewHandler nativeHandler = new NativePreviewHandler() {
@Override
public void onPreviewNativeEvent(NativePreviewEvent event) {
preventBack();
if (SessionFactory
.getValue(SesisonKey.CLIENT_SESSION_EXPIRED) != null) {
boolean expire = (Boolean) SessionFactory
.getValue(SesisonKey.CLIENT_SESSION_EXPIRED);
if (expire) {
boolean show= false;
//logout session code
ClientSideTimers.renewSessionTimer();
}
}
}
};
Event.addNativePreviewHandler(nativeHandler);
如果您的屏幕稳定 2 分钟,它将通过计时器设置过期会话变量值 false,如果值为 false,则注销。
SESSION_EXPIRED是会话过期检查的常量变量,而不是会话工厂是我的自定义工厂代码。你只是忽略了我的项目模式使用的变量。您只需设置一个常量,不超过该常量。如果还有疑问,请告诉我。