经理要我做个系统超时的提醒,当系统操作员长时间未进行任何操作时(设置的是20分钟),需要系统自动弹出一个对话框提示“系统已经超时,您需要重新登录!”,然后跳转到登录界面。
session是在服务端的,客户端不和服务端交互是不可能知道是否已经超时的,于是本人通过在公共JSP页面使用JS定时器每10秒钟转到DWR去验证,在DWR中获取Session去验证Session是否已经超时被invalidate了,但是每次只要DWR只要验证(产生了一次交互)一次就会刷新一次Session的生命周期,这么一来Session的生命周期永远都是10秒钟,Session永远都不会超时了,如何解决这个问题呢?
一下是JS中的代码:
setInterval("check();",10000);//定时10秒调用DWR查看session是否过期
function check(){
onlineCheckDwr.onlineCheck(function(obj){
if(obj){
alert('长时间不操作,系统将强制退出!');
window.top.location.href='<%=basePath %>login.jsp';
}
});
}
DWR代码如下:
public class onlineCheckDwr {
@SuppressWarnings("deprecation")
public boolean onlineCheck(){
WebContext ctx = WebContextFactory.get(); 
String tlrno = User.getTlrno(ctx.getHttpServletRequest());
if(StringUtils.isNotBlank(tlrno)){
return false;
}else{
return true;
}
}
}

解决方案 »

  1.   

    首先要逻辑清楚:
    需要系统自动弹出一个对话框提示“系统已经超时,您需要重新登录!”,然后跳转到登录界面。说明这个时候session已经被你们清除了,
    你们不用每10秒中访问,就只设置session超时就可以了,sesison超时后,清除session或者设置无线,用户下次再访问时候获取不到session或者里面的信息直接跳转的登录提示界面
      

  2.   


    您的方法我也有考虑过,web.xml中定义的超时时间过了以后,系统会自动调用实现了HttpSessionListener接口的类,调用其中的sessionDestroyed方法去销毁session,问题是销毁以后我该如何从该方法中跳转至之前的页面并且显示一个对话框呢?
      

  3.   


    这种事情可以放到服务端去解决 不一定非得依赖客户端的JS假设你在Session中保存一个值 为某个用户上一次操作的时间 当这个用户执行操作的时候 通过过滤器或者拦截器拦截住请求并在Session中判断这次请求的时间与上次请求的时间之间的间隙是否超过你设置的时间 如果超过的话则T到其他页面去至于你说的什么DWR那个 你可以区分下请求类型 假设是DWR的请求则不对其进行任何操作即可
      

  4.   


    谢谢楼上的几位高手的帮忙了,我的问题解决了,在DWR校验的时候我不去使用session是否存在校验了,二是在LoginSessionListener(继承了HttpSessionListener)接口中定义了一个映射关系:         // 保存 sessionId和userName 的映射(sessionid,userName)
    public static Map<String, String> hUserName = new ConcurrentHashMap<String, String>();
    // 集合对象,保存session 对象的引用(sessionid,session)
    public static Map<String, HttpSession> htsession = new ConcurrentHashMap<String, HttpSession>();
    // 保存用户操作员代码与session id 的关联
    public static Map<String, Integer> mpOper = new ConcurrentHashMap<String, Integer>();有了这个映射关系我就可以通过JS中传一个操作员号(username)到DWR中,DWR拿这个username去hUserName里去找就是了,有就说明用户在线session未销毁,(因为web.xml过期后会自动调用sessionDestroyed方法,)
    public void sessionDestroyed(HttpSessionEvent se) {
    //当前操作员的在线状态,销毁session。
    hUserName.remove(se.getSession().getId());
    htsession.remove(se.getSession().getId());
    se.getSession().invalidate();}
    所以可以理解为这个映射关系和session是共存的,所以每次校验这个映射关系就不会影响到session的生命周期了。 
      

  5.   

    加一个fliter 就可以了吗。每次请求查一下session在不。不在。转到login 显示一个对话框。不就得了