Session 过期时的处理方法之二:Redirect 到其它页面

开发运行环境:JDeveloper 11.1.2.4 +Oracle XE Database 11gR2

在前一个实验的基础上,只要修改web.xml中的WARNING_BEFORE_TIMEOUT值就可以,比如默认的120秒。

其它的地方都不需要修改。

1. web.xml

<context-param>

   <param-name>oracle.adf.view.rich.sessionHandling.WARNING_BEFORE_TIMEOUT</param-name>

   <param-value>120</param-value>

</context-param>

 

<filter>

   <filter-name>SessionTimeOutFilter</filter-name>

   <filter-class>view.SessionTimeOutFilter</filter-class>

   <init-param>

       <param-name>SessionTimeoutRedirect</param-name>

       <param-value>index.jsf</param-value>

   </init-param>

</filter>

 

<filter-mapping>

   <filter-name>SessionTimeOutFilter</filter-name>

   <servlet-name>Faces Servlet</servlet-name>

</filter-mapping>

2. 运行效果
session过期前两分钟弹出“失效警告”窗口,如果没有理会,那么session过期后,警告窗口自动关闭,然后弹出“页面失效”窗口,点击确定后,会Redirect到你指定的页面,我这里是index.jsf。

我的实验结果发现,后台会报出一个异常:
java.lang.IllegalStateException: HttpSession is invalid
       atweblogic.servlet.internal.session.SessionData.getAttributeNames(SessionData.java:483)
       atview.SessionTimeOutSessionListener.sessionDestroyed(SessionTimeOutSessionListener.java:30)
       atweblogic.servlet.internal.EventsManager.notifySessionLifetimeEvent(EventsManager.java:276)
       at weblogic.servlet.internal.session.SessionData.remove(SessionData.java:971)
       atweblogic.servlet.internal.session.MemorySessionContext.invalidateSession(MemorySessionContext.java:69)
       Truncated. see log file forcomplete stacktrace
这是因为我定义了一个SessionListener,用来监听session何时创建,何时失效。
但我不知道为何sessionDestroyed时,会抛出这个异常,不过页面没有受到影响。

3. SessionTimeOutSessionListener 

package view;

import java.util.Enumeration;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class SessionTimeOutSessionListener implements HttpSessionListener {
    private HttpSession session = null;

    public void sessionCreated(HttpSessionEvent event) {
        System.out.println("%%%%%%%%%%%%%%%%%%%%%%%%%Session Created at " + new java.util.Date());
        session = event.getSession();

        String name = null;
        Object value = null;
        for (Enumeration enu = session.getAttributeNames();enu.hasMoreElements(); ) {
            name = (String)enu.nextElement();
            value = session.getAttribute(name);
           System.out.println("%%%%%%%%%%%%%%%%%%%%%%%%% name = " + name +",  value= " + value);
        }
    }

    public void sessionDestroyed(HttpSessionEvent event) {
        System.out.println("%%%%%%%%%%%%%%%%%%%%%%%%%Session Destroyed at " + new java.util.Date());
        String name = null;
        Object value = null;

  for(Enumeration enu = session.getAttributeNames(); enu.hasMoreElements(); ) {
            name = (String)enu.nextElement();
            value = session.getAttribute(name);
           System.out.println("%%%%%%%%%%%%%%%%%%%%%%%%% name = " + name +",  value= " + value);
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值