session.invalidate() 报错

public class SessionListener implements HttpSessionListener{
	
	private SessionUtils context = SessionUtils.getSessionContext();
	
	@Override
    public void sessionDestroyed(HttpSessionEvent e) {
		System.out.println("session过期操作----------->>>>>>>>>>>>");
        context.delSession(e.getSession());//只是处理session超时的情况
    }
}

    //删除
    public synchronized void delSession(HttpSession session) {
        if(session!= null){
              session.invalidate();
        }
    }
    
undertow配置
undertow.session.timeout=180
undertow.session.hotSwap=true

每次执行到 session.invalidate() 都会报错:
Exception in thread "XNIO-2 task-1" java.lang.RuntimeException: java.lang.IllegalStateException: UT000021: Session already invalidated
	at io.undertow.servlet.core.SessionListenerBridge.sessionDestroyed(SessionListenerBridge.java:75)
	at io.undertow.server.session.SessionListeners.sessionDestroyed(SessionListeners.java:61)
	at io.undertow.server.session.InMemorySessionManager$SessionImpl.invalidate(InMemorySessionManager.java:586)
	at io.undertow.server.session.InMemorySessionManager$SessionImpl$2$1.run(InMemorySessionManager.java:393)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.IllegalStateException: UT000021: Session already invalidated
	at io.undertow.server.session.InMemorySessionManager$SessionImpl.invalidate(InMemorySessionManager.java:578)
	at io.undertow.server.session.InMemorySessionManager$SessionImpl.invalidate(InMemorySessionManager.java:560)
	at io.undertow.servlet.spec.HttpSessionImpl.invalidate(HttpSessionImpl.java:195)
	at com.richfit.web.util.SessionUtils.delSession(SessionUtils.java:86)
	at com.richfit.web.listener.SessionListener.sessionDestroyed(SessionListener.java:15)
	at io.undertow.servlet.core.ApplicationListeners.sessionDestroyed(ApplicationListeners.java:328)
	at io.undertow.servlet.core.SessionListenerBridge.doDestroy(SessionListenerBridge.java:98)
	at io.undertow.servlet.core.SessionListenerBridge.access$000(SessionListenerBridge.java:41)
	at io.undertow.servlet.core.SessionListenerBridge$1.call(SessionListenerBridge.java:54)
	at io.undertow.servlet.core.SessionListenerBridge$1.call(SessionListenerBridge.java:51)
	at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:42)
	at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
	at io.undertow.servlet.core.SessionListenerBridge.sessionDestroyed(SessionListenerBridge.java:73)
	... 6 more
	
不知道哪里出问题了 应该怎么改

jfinal 4.5 jfinal-undertow 1.9


评论区

doubuxingle

2019-12-05 09:57

异常已经说了是session已失效,那就是没必要再调用了

yunqi

2019-12-05 10:14

但是 获取到session不为null 错误信息感觉是不是 undertow 接管了session的那块给 invalidate()了

JFinal

2019-12-06 23:57

session 已失效,所以,不能再调用它的 session.invalidate() 方法

虽然获取到的不同 null, 但是 session 中的有效时间可能已经过去了,例如:
1:你的 session 过期时间是下午 1:30
2:你当前线程在下午 1:29 分 59 秒的时候获取了 session,该值不为 null
3:你当前线程在执行 session.invalidate() 的时候,时间又向后推移了,已经超过下午 1:30,所以必然会出现你碰到的异常

如果一定要调用 invalidate() 方法的话,可以用一个 try catch 处理一下