1. 使用filter,即过滤器,如果session超时,就跳转到指定页面,可以对filter指定匹配的模式,让servlet接受请求前先通过filter。
2. 在session或其它地方暂存当前地址,隐藏域也可以,登录成功后自动跳转即可。

解决方案 »

  1.   

    我认为好的方式是继承HttpSessionListener类。实现 public void sessionDestroyed(HttpSessionEvent se)方法。在sessionDestroyed当中调用转向的页面。
    具体的用法你可以参照servlet API。
    HttpSessionListener这个类是专门用来监听session的。
      

  2.   

    hoho
    如何实现登陆后回到先前的 页面呢
      

  3.   

    使用Filter比较好,在Filter里面判断session是否为NULL,然后你再做相应的处理。
    当然楼上兄弟说的用实现HttpSessionListener接口也可以,
    但我还是觉得使用Filter更简单
      

  4.   

    如果session在子窗口中timeout怎么回到处在父窗口的登陆页面呢
      

  5.   

    多谢各位,我试了一下lisener和filter,但遇到了几个问题:
     1。如果用listener 覆写 sessionDestroyed(HttpSessionEvent se)方法,里面如何取到session呢,没有HttpServletRequest啊,HttpSessionEvent 没有这些方法。
     2。如果用filter的话代码倒是可以实现,但是我配置好以后却始终没有运行那个filter,郁闷啊,我的应用已经有Set Character Encoding filter,那个filter是运行ok的。付上web.xml配置段,filter代码。
        web.xml :  
      <filter>
        <filter-name>Session Timeout Handle</filter-name>
        <filter-class>com.mao.util.filter.SessionTimeOutFilter</filter-class>
      </filter>
      <filter>
        <filter-name>Set Character Encoding</filter-name>
        <filter-class>com.mao.util.filter.SetCharacterEncodingFilter</filter-class>
        <init-param>
          <param-name>ignore</param-name>
          <param-value>true</param-value>
        </init-param>
        <init-param>
          <param-name>encoding</param-name>
          <param-value>GBK</param-value>
        </init-param>
      </filter>
      <filter-mapping>
        <filter-name>Set Character Encoding</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
      <filter-mapping>
        <filter-name>Session Timeout Handle</filter-name>
        <url-pattern>/*.do</url-pattern>
      </filter-mapping>filter 中doFilter方法:
      public void doFilter(ServletRequest request, ServletResponse response,
      FilterChain chain)
      throws IOException, ServletException {
       System.out.println("start to filter session timeout");
       HttpServletRequest httpreq=(HttpServletRequest)request;
       HttpSession session=httpreq.getSession(false);
       if(session==null){
         System.out.println("session timout,send redirect to jsp");
    //     RequestDispatcher dispatcher = null;
    //dispatcher =
    //    getServletContext().getRequestDispatcher("/approve.jsp");
    //dispatcher.forward(request, response);
       HttpServletResponse httprep=(HttpServletResponse)response;
       httprep.sendRedirect("sessiontimout.jsp");
       }
       else{
         System.out.println("session doesn't timeout, continue");
         // Pass control on to the next filter
      chain.doFilter(request, response);
       }
      }
      

  6.   

    忘记说了,如果将 <url-pattern>/*.do</url-pattern>改为/*的话,打开首页就会死循环了.
      

  7.   

    如果是即时就要判断session是否过滤的话。
    你可能要使用filter了。
    因为本人觉得只有filter才能在每打开另外一个连接之前才能判断他的session是否过期。
    filter就跟servlet差不多,很容易上手的!如果只是告诉服务器session过期的话可以用HttpSessionListener监听器!
      

  8.   

    如果用HttpSessionListener的话,过期了的话客户端应该不能立刻做出反应。用Filter的话就可以控制.每当打开网页就会触发到Filter的,所以要控制客户端
    当Session过期不给访问的话建议使用Filter
      

  9.   

    try{

       //MyForm myForm = (MyForm)form;
       String resUrl=request.getRequestURI();
       String operationUrl=request.getParameter("action");
       User user = (User)request.getSession().getAttribute(Constants.SESSION_USER);
           if(user!=null){
        IRole cRole =(IRole)getServiceFactoryImpl().getService(ServiceFactory.ROLE_IMPL);
     if(cRole.getResOpByUrl(resUrl,operationUrl)!=null){
        if(!cRole.hasPrivilege(user.getRoleID(),resUrl,operationUrl)){
    throw new PostException("exception.noPrivilege");

    }
    }
    }else{
         if(!resUrl.equals("/login.do")){
     request.setAttribute(Constants.URL_NEXT,"/jsp/login/login.jsp");
     throw new PostException("exception.session.expire");
         }

    }
      return executeAction(mapping, form, request, response);
        }catch(PostException pe){
    log.error(pe);
    throw pe;
        }catch(NullPointerException npe){
    log.error(npe);
    throw new PostException("global.exception.errorLink");
        }catch(DBMgrException DBe){
    log.error(DBe);
    throw new PostException("global.exception.systemBusy");
        }catch(Exception e){
             log.error(e);
             throw new PostException("global.exception.unknow");

        }