1. 程式人生 > >對異常 java.lang.IllegalStateException: getAttribute: Session already invalidated的理解

對異常 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 解決方法之一

       為什麼說是解決方法之一呢。因為遇到這個問題後看到了很多此問題的解決方案。很多文章寫的原因是檔案下載是報的這個錯誤,而我遇到這個問題的時候根本就沒有寫檔案下載的功能。(我用的是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