成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何在PHP中保持SESSION以及由此引發的一些思考

開發 后端
最近的一個項目,里面有一個比較大的表單,用戶完成它需要很多時間,很多用戶花了千辛萬苦完成之后,一提交發現SESSION過期,系統退出了,所以引起了研究如何設置SESSION以及PHP中保持SESSION在線的需要,下面是一些心得體會。

什么是SESSION?

按照WIKI的解釋,SESSION是存在于兩個通信設備間的交互信息,在某一時間建立,經過一定的時間后失效。常見的SESSION有:TCP SESSION、WEB SESSION(HTTP SESSION)、LOGIN SESSION等。

根據OSI模型中,會話實現的位置不同,SESSION主要分為幾種,一種是應用層會話,包括WEB SESSION(HTTP SESSION)和telnet遠程登錄session;會話層實現的,包括Session Initiation Protocol(SIP)和Internet Phone Call;在傳輸層實現的有TCP SESSION。

本文主要討論WEB SESSION,其一般有兩種:客戶端SESSION和服務器端SESSION,后一種最常見的屬于Java Beans提供的。

SESSION是做什么的?

在計算機領域,特別是網絡方面,SESSION使用的特別廣泛,也可以稱為是對話(Dialogue)、會話等,一般是指在兩個通信設備間存儲的狀態,有時也發生在用戶和計算機之間(Login SESSION)。

區別于無狀態的通信,SESSION通常用來存儲通信狀態,因此通信的雙方至少有一方需要存儲SESSION的歷史記錄,從而實現兩者間的通信。

SESSION(WEB SESSION)是怎么實現的?

瀏覽器和服務器之間進行HTTP通信時,通常會包含一個 HTTP Cookie 來標識狀態,通常會有一個唯一的 SESSIONID ,SESSION通常記錄著用戶的一些驗證信息和級別。

在幾中編程語言中最常用的Http Session Token是,JSESSIONID(JSP),PHPSESSID(PHP),ASPSESSIONID(ASP),這個標識通常由哈希函數產生,能夠唯一表示這個用戶的身份,在服務器和客戶端通信時,作為GET或者POST的參數存儲在客戶端。

SESSION的實現方式通常有兩種,服務器端SESSION和客戶端SESSION,兩種方式各有優缺點。

服務器端SESSION實現容易并且效率比較高,但是遇到負載均衡或者高可用性需求的時候,處理起來就比較困難,對于那種內生系統不存在存儲設備的時候,也是不可用的。負載均衡可以通過共享文件系統或者強制客戶只能登錄到一臺服務器上來實現,但是這樣會降低效率。對于沒有存儲的設備,也可以通過使用RAM(參考參考資料6)來解決服務器端SESSION的實現,這種方法這對哪些客戶端鏈接有限的系統有效(諸如路由或者接入點設備)。

客戶端SESSION的使用可以解決服務器端SESSION的一些問題,比如避免了負載均衡的算法等,但是同時也會產生一些自身的問題。客戶端SESSION使用Cookie和加密技術來在不同的請求間保存狀態。在每一個動態頁面結束后,會統計當前的SESSION,并把它發回客戶端。每次成功請求后,會把cookie再發送到服務器端,來讓服務器“記起”這個用戶的身份。客戶端SESSION最重要的問題就是安全問題,一旦cookie被劫持或者篡改了,用戶的信息的安全性就喪失了。

PHP中如何設置SESSION?

搭建好PHP的開發環境后,通過phpinfo()可以查看到與SESSION有關的部分包括:

SESSION模塊,在PHP V5.2.9版本中,一共有25個變量。其中,平時設置中常會用到的幾個有:

session.cookie_lifetime        設置存儲SESSIONID的cookie過期時間

session.name                SESSION的COOKIE名稱,默認為PHPSESSID

session.save_handler        SESSION的存儲方式,默認為FILE       

session.save_path            Fedora下面默認存儲在/var/lib/php/session

session.gc_probability

session.gc_divisor

session.gc_maxlifetime        這三個選項用來處理GC機制發生的機率

session.cache_limiter    (nocache,private,private_no_expire,public)

session.cache_expire    這兩個選項是用來緩存SESSION的頁面

先來考慮***個問題,SESSION多久會過期,他是如何過期的?如果要在PHP程序中使用SESSION,一定要先引用session_start(),這個函數一執行,就會在SESSION的存儲目錄(如果使用了file handler)生成一個SESSION文件,里面內容是空的,同時瀏覽器會見里一個name為PHPSESSID的cookie,里面存儲著一個hash出來的SESSION的名字。

SESSION的過期依賴于一個垃圾回收機制(Garbage Collection),SESSION創建后作為一個文件存放在服務器上,客戶端腳本每訪問一次SESSION中的變量,SESSION文件的訪問時間就會進行更新。每次訪問都是根據客戶端存儲的SESSIONID去請求服務器中存儲的唯一的SESSION,當客戶端的cookie過期后,就無法知道要訪問的是哪一個SESSION,盡管此時服務器上的SESSION文件還沒有被過期收回,這樣就會造成服務器資源的浪費。

但是同時,如果我們希望用戶的session馬上過期的話,我們就可以通過設置cookie的辦法來實現。SESSION的回收是在每次訪問頁面的時候進行的,回收的機率由session.gc_probability,session_gc_divisor指定,默認士1/100。如果設置為1,則每次超過了SESSION的生存周期去訪問的話,SESSION一定會被回收。

兩種需求:1、PHP中保持SESSION不過期或延長SESSION過期時間;2、使SESSION立即過期。

1、PHP中保持SESSION不過期和延長SESSION過期時間非常必要,特別是在內部應用系統中或者有很大的表單的時候。想想你的老板在填寫一個表單,剛好碰上午飯時間,留著這個表單等吃飯回來,填寫完剩余的內容,提交后他看到什么,一般來說都是一個登錄界面。想要提高用戶體驗,關鍵是要讓老板的表單不出問題,我們就必須延長SESSION的生存周期。

PHP中保持SESSION不過期和延長SESSION過期時間,可以通過設置session.gc_maxlifetime來實現,不過首先需要保證客戶端的cookie不會在gc執行回收之前失效。通過設置一個較長的gc_maxlifetime可以實現延長session的生存周期,可是對于不是所有請求都會保持很久的應用來說,這么做對于服務器配置顯然不是一個***的選擇。

我們知道SESSION的回收機制是根據SESSION文件的***訪問時間來判斷的,如果超過了maxlifetime,則根據回收機率進行回收。所以我們只需要定期的去訪問一下SESSION就可以了,而這可以通過刷新頁面來實現,根據這個思路,解決的方法就有了。

通過JS定期的去訪問頁面;

利用Iframe定期的刷新頁面;

直接利用程序發送HTTP請求,這樣就可以避免在頁面中嵌入其他的元素;

下面是利用JS發送請求實現的保持SESSION不過期的實現方法,這樣我們就只需要在需要SESSION保持長時間的頁面(比如大表單頁面)。

   

  1. <script type="text/javascript">  
  2.         function keepMeAlive(imgName){  
  3.             myImg = document.getElementById(imgName);  
  4.             if(myImg) myImg.src = myImg.src.replace(/\?.*$/, '?' + Math.random());  
  5.         }  
  6.  
  7.         window.setInterval("keepMeAlive('phpImg');", 4000);  
  8.     </script>  
  9.     <img id="phpImg" src="http://www.phpplot.com/phpplot/session/sess_refresh.php?" width="1" height="1" /> 

其中URL后加入一個隨機數是為了避免這個鏈接的請求被瀏覽器緩存。

2、使SESSION立即過期的方法就比較多了,我們可以session_destroy(),也可以用上面的思路,請求一個session_destroy的頁面。

SESSION安全嗎?

PHP的手冊中明確寫出:SESSION并不能保證儲存在SESSION中的信息一定只能被他的創建者所看到。

如果想要安全的處理一些遠程的操作,那么HTTPS是唯一的選擇。最基本的,不要認為一個用戶信息在SESSION中存在就認為這個用戶一定就是他本人,雖然SESSION中的信息會給你他已經經過了用戶名和密碼驗證的假象。所以,如果需要做一些修改密碼或者類似的事情的時候,讓用戶重新輸入密碼是一個比較好的選擇。

早期的Apache版本并沒有采用COOKIE的方式來存儲PHPSESSID,而是采用的URL-rewrite,也就是每個URL后面都會加上PHPSESSID=<sessionid>來表明它屬于那個激活的SESSION,新版的Apache已經將這個屬性設置為默認關閉。

session.use_trans_id = 0;

所以從這個意義上來講,延長SESSION的時間過長或者保持SESSION一直在線對于安全來說始終不是一件好事情。***的解決辦法就是用戶提交跳轉到登錄窗口,登錄后又能夠回到填寫頁面,并且所有的數據都還在。這個的實現方式現在用Ajax來解決應該沒什么困難,每隔一定時間就把當前的用戶數據POST到一個存儲位置,不管是XML或者JSON。

PHP中保持SESSION拾遺:

對于客戶端不支持JavaScript的情況可以采用的方法:

1、寫一個浮層,顯示在最頂層,如果用戶未禁用JS,則讓浮層消失;

2、將所有的INPUT都設置為disable,然后再用JS設置為enabled;

以上這兩種方式都是在JS被禁用的時候,所有功能都不能用,如何在JS被禁用的情況下使我們的應用仍然正常工作,這個貌似就比較困難。實現這個的所花的時間和所收到的效果大家要權衡一下。

【編輯推薦】

  1. PHP 5中新增加日期(date)函數的常量簡介
  2. 在PHP中如何判斷AJAX請求
  3. 如何書寫安全的PHP代碼
  4. PHP5中的異常處理詳解
  5. 實戰PHP5+Apache2.2+MySQL5.1配置經歷
責任編輯:彭凡 來源: cnblogs
相關推薦

2023-08-01 23:08:07

2021-06-06 16:15:57

地區接口項目

2009-06-25 09:50:32

JSF

2020-02-03 16:03:36

疫情思考

2011-11-30 15:57:18

2024-05-16 10:44:10

2020-07-14 09:23:49

安全運營甲方乙方

2018-07-11 14:06:04

數據質量數據治理數據清洗

2017-09-01 12:48:34

DevSecOps安全運維

2017-12-21 07:54:07

2019-09-17 09:21:01

2018-06-14 09:35:35

2011-08-01 10:37:29

軟件項目管理

2021-06-10 10:02:19

優化緩存性能

2009-06-18 13:42:48

Hibernate s

2021-01-14 23:24:38

incaseforma蠕蟲病毒

2013-04-19 10:01:19

jQueryJS

2009-08-27 11:02:22

JavaScript事

2024-12-27 10:51:53

2012-12-19 09:36:49

測試自動化測試
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品免费国产视频 | 精品欧美一区二区三区久久久 | 伊人久久精品一区二区三区 | 日日操网站 | 欧美视频二区 | 深夜福利影院 | 国产黄视频在线播放 | 日日操夜夜操天天操 | 精品亚洲一区二区三区四区五区 | 91精品国产综合久久小仙女图片 | 免费国产黄网站在线观看视频 | 国产免费一区二区 | 中文字幕在线观看 | 久久9精品| 在线中文视频 | 欧美日韩三级在线观看 | 亚洲视频三 | 日日拍夜夜 | 美女一级毛片 | 国产在线激情视频 | 粉嫩高清一区二区三区 | 日韩人体视频 | 国产精品久久99 | 中文精品视频 | 欧美日韩亚洲在线 | 亚洲一区二区精品视频 | 91精品国产美女在线观看 | 最新中文字幕在线 | 日韩中文字幕区 | 欧美精品影院 | 午夜影院操 | 成人久草| 免费高清av | 99精品视频免费在线观看 | 中文字幕视频在线免费 | 久久久一区二区三区四区 | 亚洲视频www | 欧美精品久久久久久 | 亚洲一区二区三区免费视频 | av大片在线观看 | aa级毛片毛片免费观看久 |