對異常 java.lang.IllegalStateException: getAttribute: Session already invalidated的理解
最近專案日誌中總是丟擲異常
java.lang.IllegalStateException: getAttribute: Session already invalidated
經調查發現,問題出在HttpSession session.getAttribute("paramName");這個方法執行時。
異常原因為:從Session中獲取屬性值的時候,Session已經無效。
有兩種可能導致Session無效(1)Session timeout;(2)程式中呼叫了session.invalidate()方法。
搜尋了整個專案Code,發現在使用者登出的過程中的確執行了session.invalidate()方法。
考慮發生此種情況的場景一:
1)使用者在多個IE例項中使用同一個帳號登入了系統,此時多個IE例項的使用者處於同一個Session會話中。
2)使用者在一個IE例項視窗中進行了登出操作(此專案中,登出操作被執行後,IE視窗被程式自動關閉),此時,session.invalidate()方法被呼叫,session處於無效狀態。
3)此時,可能使用者開啟的另為一個IE例項視窗中正在進行資料錄入操作,填寫了必要欄位後,使用者提交。
4)業務層,通過傳遞pageContext例項,訪問本次session,並呼叫session.getAttribute();方法獲取登入使用者的ID,使用者記錄記錄修改人。
這時,由於session已經處於無效狀態,導致方法session.getAttribute();呼叫丟擲以上描述的異常。
異常場景二:
專案中的jsp頁面結構如下
abc.jsp
********************************
<%@ include file="/home/include.jsp" %>
...
本jsp頁面的處理程式碼
********************************
而include.jsp頁面的程式碼如下:
<%@page import="com.trustmart.webapp.menu.CookieProcess"%>
<%@taglib uri="/Ap_WMC/input" prefix="input"
%>
<%@taglib uri="/Ap_WMC/ui" prefix="ui"
%>
<%@taglib uri="/Ap_WMC/db" prefix="db"
%>
<jsp:useBean id="user" class="com.trustmart.webapp.User" scope="session"/>
<%
if(user.getUserName()==null){
%>
<script language="JavaScript">
parent.location="/Ap_WMC/home/menu.jsp?relogin=1&mode=<%=mode%>";
</script>
<%
return;
}
%>
通過宣告在session範圍內的javabean User來判斷會話是否過期
這樣,action被提交時:
首先在include.jsp頁面中進行session有效性判斷;
接著abc.jsp的業務程式碼中會訪問session來獲取User例項。
考慮這樣一種情況:
1)使用者session將在1秒後timeout;
2)此時使用者正好執行了abc.jsp的提交動作,此時在include.jsp判斷的時候,session正好是有效的
3)但是,當執行到abc.jsp的action業務邏輯程式碼session.getAttribute()時,session正好失效,異常發生。
我想,這種情況在實際中極有可能發生(使用者在session即將timeout的前1-2秒submit),而在實際的生產環境中,一次request由於網路原因不能在1-2s中得到響應也很平常。
對於本專案中的情況而言,判斷session是否有效的程式碼,和接下來執行session.getAttribute()方法距離太遠,中間需要執行很多其他的程式碼,這進一步
增加了以上描述的情況發生的可能性。
使用者場景模擬:
1)開啟兩個IE瀏覽器例項,使用同一賬戶登入系統
2)在一個IE例項一中,進行abc.jsp頁面的提交動作,並在session.getAttribute()方法處設定斷點,等待在另為一個IE例項中執行登出動作
3)在E例項二中執行登出動作
4)回到IE例項一,在斷點處繼續執行,異常重現
...
Caused by: java.lang.IllegalStateException: getAttribute: Session already invalidated
×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
以下是解決此異常的方法:
考慮到這裡的情況,那就必須在abc.jsp的業務處理程式碼中session.getAttribute()方法執行前再進行一次session有效性判斷,程式碼如下:
HttpServletRequest request = (HttpServletRequest)pageContext.getRequest();
//傳遞引數true,那麼當session過期時,新的session被建立,接下來可通過session.isNew()的返回值來判斷是不是同一個session
//返回值為:true,新的session被建立,action提交執行時的那個使用者session已經無效
//返回值為:false,同一個session,仍然有效
HttpSession session = request.getSession(true);
if (session.isNew()) {
//session無效,在這裡進行頁面跳轉,返回到登入頁面
}
以上就是,想跟大家分享的一點經驗,希望多大家有所幫助。。。。相關推薦
對異常 java.lang.IllegalStateException: getAttribute: Session already invalidated的理解
最近專案日誌中總是丟擲異常 java.lang.IllegalStateException: getAttribute: Session already invalidated 經調查發現,問題出在Http
java.lang.IllegalStateException: FragmentManager is already executing transactions 及 SmartTabLayout複用
在複用 SmartTabLayout 時, 出現了標題所示的錯誤。首先我的場景是Activity下兩個fragment :A 和 B,A中使用了SmarttabLayout和viewpager結合, B也同樣使用了這個結合, 然後就出現了B
spring boot中使用dubbo出現異常java.lang.IllegalStateException: <dubbo:service interface="" /> interface not allow null!
今天我在閒的時候,自己在springBoot中使用dubbo的時候,啟動的時候,發現啟動失敗,報java.lang.IllegalStateException: <dubbo:service interface="" /> interface not allow null! 這個異常。我首先看了是
OKHttp異常java.lang.IllegalStateException: closed與debug時遇到的坑
今天第一次使用okhttp,因為介面沒有告知返回的json格式,只好debug自己看返回的串,結果初次使用直接崩潰了 錯誤提示java.lang.IllegalStateException: closed 原因在網上查到是因為 OkHttp請求回撥中response.body().st
控制檯報錯: java.lang.IllegalStateException: getOutputStream() has already been called for this response.
1、錯誤描述 Caused by: java .lang .IllegalStateException:
java.lang.IllegalStateException: getOutputStream() has already been called 解決方法之一
為什麼說是解決方法之一呢。因為遇到這個問題後看到了很多此問題的解決方案。很多文章寫的原因是檔案下載是報的這個錯誤,而我遇到這個問題的時候根本就沒有寫檔案下載的功能。(我用的是SpringBoot) 其實說來這個問題的出現也是自己馬虎。報錯如下
使用Servlet3.0新特性asyncSupported=true時拋異常 java.lang.IllegalStateException: Not support...
http://www.tuicool.com/articles/zYfmme 最近在運用Servlet3.0新特性:非同步處理功能的時候出現以下了2個問題: 執行時會丟擲以下兩種異常: 一月 19, 2014 3:07:07 下午 org.apache.catalina.core
java.lang.IllegalStateException: FragmentManager is already executing transactions 及 SmartTabLayout複用
在複用 SmartTabLayout 時, 出現了標題所示的錯誤。首先我的場景是Activity下兩個fragment :A 和 B,A中使用了SmarttabLayout和viewpager結合, B也同樣使用了這個結合, 然後就出現了B中滑動異常或不顯示了, 網上的答案有幾種情況:
【spring boot】【elasticsearch】spring boot整合elasticsearch,啟動報錯Caused by: java.lang.IllegalStateException: availableProcessors is already set to [8], reje
spring boot整合elasticsearch, 啟動報錯: Caused by: java.lang.IllegalStateException: availableProcessors is already set to [8], rejecting [8] at
java.lang.IllegalStateException: getWriter() has already been called for this response問題解決
java.lang.IllegalStateException: getWriter() has already been called for this response在執行下述程式碼時報錯,OutputStream out = getResponse().getOutp
java.lang.IllegalStateException: getOutputStream() has already been called for this response解決方案
原因:在JSP頁面釋放資源的時候,呼叫了ServetResponse.getWriter()方法 。 1、Jsp解決辦法,在程式的最後新增: <% out.clear(); out = pageContext.pus
java.lang.IllegalStateException: getOutputStream() has already been called 解決辦法
今天上班做從資料庫查詢圖片到jsp頁面顯示,結果報java.lang.IllegalStateException: getOutputStream() has already been called 錯誤,折騰了將近半天的時間才弄出來。 在網上查閱了很多資料基本上都是一家之
spring boot(多資料來源)+spring batch 解決異常: java.lang.IllegalStateException
專案整合說明: spring boot(配置多資料來源) spring batch 資料來源配置檔案: @Configuration public class DataSourceConfig { @Primary @Bean(n
檔案下載:java.lang.IllegalStateException: getOutputStream() has already been called for this response
1.報錯資訊 一月 24, 2018 10:23:47 下午 org.apache.catalina.core.ApplicationDispatcher invoke 嚴重: Servlet.service() for servlet jsp threw
java.lang.IllegalStateException: getOutputStream() has already been called for this response
報錯原因: 當使用 javax.servlet.ServletResponse.getOutputStream() 方法獲取 ServletOutputStream 物件; 又再使用 javax.servlet.ServletResponse.getWriter(
java.lang.IllegalStateException: Fragment already added異常的處理
先判斷是否有fragment,如果fragment不為null,則判斷是都新增進去了,如果新增過直接展示不要重複建立 StaticFragment staticFragment = new StaticFragment(); if (staticFragment != null) { i
java.lang.IllegalStateException: The specified child already has a parent.解決方案
公司的老專案,裡面使用的viewpager,最近測試反饋說閃退了,翻到日誌看到報如下錯誤java.lang.IllegalStateException: The specified child already has a parent.然後就找度娘,果不其然,度娘沒有讓我失望,找到了解決方法
java.lang.IllegalStateException: commit already called
今天遇到一個 bug ,特來做一下記錄; 描述:我寫了 一份封裝的 Fragment 來回切換,但是顯示不出來;懷疑是 Fragment 在呼叫 show() 方法時也應該新增 commitAllowingStateLoss() 提交事務的方法,於是呼叫該方法後。便出現了異常。 異
關於Timer計時器控制元件的java.lang.IllegalStateException: TimerTask is scheduled already問題分析
博主最近在改被人的專案,準備寫一個類似今日頭條的載入完成提示,就寫了個計時器讓它顯示幾秒,於是就用到了timer這個計時器控制元件,簡單的正常程式碼如下,因為博主的載入需要多次,當timer二次呼叫的時候就出現了java.lang.IllegalStateException: TimerTask i
spring boot:java.lang.IllegalStateException異常
1、單元測試報錯: java.lang.IllegalStateException: Could not load TestContextBootstrapper [null]. Specify @BootstrapWith's 'value' attribute or make t