1. 程式人生 > >CI中session的過期時間

CI中session的過期時間

最近發現專案中有些頁面重新整理後會更新session過期時間,有些則不會,很是詭異。

我的理解是,使用者每次請求頁面時,都應該重置session過期時間=time() + session life time, 但是CI並不是這樣做。

先說下對CI session的理解,以下是CI session的配置項:

引數 預設值 選項 描述
sess_driver files files/database/redis/memcached/custom 使用的儲存 session 的驅動
sess_cookie_name ci_session [A-Za-z_-] characters only session cookie 的名稱
sess_expiration 7200 (2 hours) Time in seconds (integer) 你希望 session 持續的秒數 如果你希望 session 不過期(直到瀏覽器關閉),將其設定為 0
sess_save_path NULL None 指定儲存位置,取決於使用的儲存 session 的驅動
sess_match_ip FALSE TRUE/FALSE (boolean) 讀取 session cookie 時,是否驗證使用者的 IP 地址 注意有些 ISP 會動態的修改 IP ,所以如果你想要一個不過期的 session,將其設定為 FALSE
sess_time_to_update 300 Time in seconds (integer) 該選項用於控制過多久將重新生成一個新 session ID 設定為 0 將禁用 session ID 的重新生成
sess_regenerate_destroy FALSE TRUE/FALSE (boolean) 當自動重新生成 session ID 時,是否銷燬老的 session ID 對應的資料 如果設定為 FALSE ,資料之後將自動被垃圾回收器刪除
這裡要說的是 sess_time_to_update ,這個配置項的意思是:每過一段時間(預設是300s) , 會將同一個會話的sessionid替換成另一個sessionid,會話仍保持有效(不改變登入狀態)。也就是說,在2小時的session有效期內,sessionid每隔300s都會更新一次,會話狀態不變。

後來對比了一下重新整理頁面更新session過期時間的頁面 和 不更新session過期時間的頁面,發現更新session過期時間的頁面不僅發起get頁面的請求,還發送了另一個ajax請求。system/libraries/Session/Session.php有一段程式碼:

session_start();

		// Is session ID auto-regeneration configured? (ignoring ajax requests)
		if ((empty($_SERVER['HTTP_X_REQUESTED_WITH']) OR strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) !== 'xmlhttprequest')
			&& ($regenerate_time = config_item('sess_time_to_update')) > 0
		)
		{
			if ( ! isset($_SESSION['__ci_last_regenerate']))
			{
				$_SESSION['__ci_last_regenerate'] = time();
			}
			elseif ($_SESSION['__ci_last_regenerate'] < (time() - $regenerate_time))
			{
				$this->sess_regenerate((bool) config_item('sess_regenerate_destroy'));
			}
		}
		// Another work-around ... PHP doesn't seem to send the session cookie
		// unless it is being currently created or regenerated
		elseif (isset($_COOKIE[$this->_config['cookie_name']]) && $_COOKIE[$this->_config['cookie_name']] === session_id())
		{
			setcookie(
				$this->_config['cookie_name'],
				session_id(),
				(empty($this->_config['cookie_lifetime']) ? 0 : time() + $this->_config['cookie_lifetime']),
				$this->_config['cookie_path'],
				$this->_config['cookie_domain'],
				$this->_config['cookie_secure'],
				TRUE
			);
		}

可以看到,對於非ajax,且session未過期的請求,是不會更新session過期時間的,只會更新 __ci_last_regenerate(如果session用檔案儲存,這個值會儲存在session檔案中),用於更新sessionid.

而對於未過期session的ajax請求,每次都會根據當前時間更新session的過期時間 。

這才導致了重新整理頁面時不更新session過期時間。很奇怪為什麼CI要這麼做。

相關推薦

如何嚴格設置phpsession過期時間

基本原理 默認 方法 path bag 當前時間 並不會 itl ring 如何嚴格限制session在30分鐘後過期!1.設置客戶端cookie的lifetime為30分鐘;2.設置session的最大存活周期也為30分鐘;3.為每個session值加入時間戳,然後在程序

thinkphpsession過期時間的配置

thinkphpsession過期週期是無效的 現在修改一下 一、修改tp的公共檔案 Thinkphp/Common/functions.php 將 if(isset($name['expire']))          ini_set('session.gc_maxlif

【l轉】phpsession過期時間設定及回收機制詳解

php中session過期時間設定及回收機制詳解: 修改php中的session過期時間可以修改php配置檔案php.ini中的session.gc_maxlifetime即可。 當php每發出一次請求時,會有1/100的概率(預設值)觸發"session回收"。如果"session回收"發生,那就會檢查

為什麼一段時間後網站後臺自動退出 phpsession過期時間設定

修改php配置檔案中的session.gc_maxlifetime。如果想了解更多session回收機制,繼續閱讀。(本文環境php5.2) 概述:每一次php請求,會有1/100的概率(預設值)觸發“session回收”。如果“session回收”發生,那就會檢查/t

phpsession過期時間設定

網上很多人給出瞭解答:修改配置檔案中的session.gc_maxlifetime。如果想了解更多session回收機制,繼續閱讀。(本文環境php5.2) 概述:每一次php請求,會有1/100的概率(預設值)觸發“session回收”。如果“session回收”發生,那就會檢查/tmp/sess_*的檔

CIsession過期時間

最近發現專案中有些頁面重新整理後會更新session過期時間,有些則不會,很是詭異。 我的理解是,使用者每次請求頁面時,都應該重置session過期時間=time() + session life time, 但是CI並不是這樣做。 先說下對CI session的理解,以下

設定Django session過期時間的方法

request.session.set_expiry(value)  你可以傳遞四種不同的值給它:  * 如果value是個整數,session會在些秒數後失效(適用於整個Django框架,即這個數值時效時整個頁面都會session失效)。  * 如果value是個data

ASP如何延長session過期時間

登陸頁內寫如下語句: if 登陸成功 then session("userid")=rs("id") session.timeout=1000 end if 在需要的地方判斷 if session("userid")="" then resposne.w

在web.config和IIS設定Session過期時間

有時候在web.config設定sessionState 或者類檔案裡設定Session.Timeout,在IIS裡訪問時每次都是達不到時間就超時,原因是因為在IIS中設定了Session的超時時間,IIS裡設定Session方法為: 在IIS裡面右鍵點選預設網站->主

Java設定Session過期時間(Spring Boot)

開發十年,就只剩下這套架構體系了! >>>   

YII2 設置session過期時間

iss cookie style use 沒有 var nts session itl 設置session過期時間 如何在YII裏設置SESSION過期時間,而不需要在php.ini裏面設置。 在protected/config/main.php裏,設置: 代碼如下

PHP如何嚴格控制session過期時間

解決 請求 tro href 客戶端 manual 優惠劵 article 添加 第一種回答 那麽, 最常見的一種回答是: 設置Session的過期時間, 也就是session.gc_maxlifetime, 這種回答是不正確的, 原因如下: 1. 首先, 這個PHP是用一

【後端-session-過期時間

程式中session都有一個預設的過期時間,其中tomcat中的預設時間為30分鐘,根據需要我們可以去手動設定session的過期時間,以下是設定session的過期時間的三個方法: 1.在tomcat-->conf-->conf/web.xm中的<session-config&

session過期時間的設定

這裡說說session過期時間的設定,一般來說方法有四種: 1. 在 tomcat——>conf——>servler.xml檔案中定義: <Context path="/test" docBase="/test" defaultSessionTimeOut

php-session過期時間設定(設定免登陸過期時間

今天用tp框架做一個登陸介面的時候,對於session的過期時間這個問題表費解,例如如何設定一個準確的session過期時間。 通過自己看tp的官方文件,裡面只提到了兩個,但是這兩個一個是session.gc_maxlifetime ,一個是cookie.session_lifetime。但是

ShiroSession過期頁面跳轉回登入頁面處理問題

package xxxxxx.core.shiro.filter;import java.io.IOException;import java.io.PrintWriter;import java.util.Map;import javax.servlet.ServletRequest;import java

spring boot實戰之shiro session過期時間

在spring boot內,設定session過期時間只需在application.properties內新增server.session.timeout配置即可。在整合shiro時發現,server.session.timeout設定為7200,但未到2小時就

django 設定session過期時間

session的超時時間設定settings中SESSION_COOKIE_AGE=60*30 30分鐘。SESSION_EXPIRE_AT_BROWSER_CLOSE False:會話cookie可以在使用者瀏覽器中保持有效期。True:關閉瀏覽器,則Cookie失效。S

為什麼要設定session過期時間

 1)節省伺服器資源:使用者可能已經關閉了瀏覽器,而沒有通過“登出”按鈕,這就導致服 務器不知道使用者已經不再使用系統了,這時候如果此使用者的相關session仍然存在,就沒有必要了。所以需要設定過期時間  2)安全:使用者長時間未操作,可能已經離開電腦做別的去了,這時候如

php session過期時間設定,純新手教學

t.php 操作方法:首先開啟t.php,然後開啟t2.php,不停地重新整理t2.php,就會不停的輸出username的值。而如果5秒之內不重新整理t2.php,就會發現,儲存的session值為空了 <?php function setSession