一,爲何session,cookie常常會有人提到php
作web開發的人基本上都會用session和cookie,可是僅僅只是會用,並不知道session和cookie的真正的工做原理,都只是憑着感受來猜想。web開發者只要利用它們來完成工做就好了,因此每一個人的理解基本都會有大同小異,我想這就是session,cookie常常會被討論的緣由。本文也是根據我的經驗,以及我的所學,對session,cookie的一些見解,純屬我的看法,但願獲得你們的更正和建議。css
二,什麼cookiehtml
cookie分爲二種web
1,以文件方式存在硬盤空間上的長期性的cookie數組
2,停留在瀏覽器所佔內存中的臨時性的cookie瀏覽器
瀏覽網站時,你會常常發現網站登陸的地方,會有提示,問你是否是要記住本身的登陸狀態,像這種狀況,登陸時填寫的一些信息會被以文件的方式存放在客戶端的硬盤上。緩存
當用戶登陸後,session會在cookie端產生一個session_id,這個session_id是存於瀏覽器所佔用的內存當中。當你關閉瀏覽器後,session_id也要消失了。安全
cookie採用的是在客戶端保持狀態的方案,它是客戶端的會話狀態的一種儲存機制。它是服務器在本地機器上存儲的小段文本或者是內存中的一段數據,並隨每個請求發送至同一個服務器。IETF RFC 2965 HTTP State Management Mechanism 是通用cookie規範。網絡服務器用HTTP頭信息向客戶端發送cookies,在客戶終端,瀏覽器解析這些cookies並將它們保存爲一個本地文件,或者本地內存中數據,它會自動將同一服務器的任何請求縛上這些cookies,因爲採用服務器端保持狀態的方案在客戶端也須要保存一個標識,因此session機制藉助於cookie機制來達到保存標識的目的,這樣就能夠解決HTTP協議無狀態的缺陷。服務器
三,什麼是sessioncookie
session是一種服務器端的信息管理機制,它把這些文件信息以文件的形勢存放在服務器的硬盤空間上,這種狀況是默認的,能夠用memcache把這種數據放到內存裏面。請參考web集羣時利用memcache來同步session
當客戶端向服務器發出請求時,要求服務器端產生一個session時,服務器端會先檢查一下,客戶端的cookie裏面有沒有session_id,是否已通過期。若是有這樣的session_id的話,服務器端會根據cookie裏的session_id把服務器的session檢索出來。若是沒有這樣的session_id的話,服務器端會從新創建一個。PHPSESSID是一串加了密的字符串,它的生成按照必定的規則來執行。同一客戶端啓動二次session_start的話,session_id是不同的。
Host | *****************.com |
User-Agent | Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.9.2.6) Gecko/20100625 Firefox/3.6.6 |
Accept | text/css,*/*;q=0.1 |
Accept-Language | zh-cn,zh;q=0.5 |
Accept-Encoding | gzip,deflate |
Accept-Charset | UTF-8,* |
Keep-Alive | 115 |
Connection | keep-alive |
Referer | http://***************.com/ |
Cookie | BX=7f34kbl5d3m3g&b=3&s=9t; AWSUSER_ID=awsuser_id1267685109158r8091; PHPSESSID=us1o22h4iveo4uni3iksabreh4 |
If-Modified-Since | Tue, 29 Jun 2010 07:55:38 GMT |
上面是一次請求的頭信息。
session產生的session_id放在cookie裏面,若是用戶把cookie禁止掉,是否是session也不能用了呢?禁止掉cookie後,session固然能夠用,不過經過其餘的方式來得到這個sessionid,好比,能夠根在url的後面,或者以表單的形勢提交到服務器端。從而使服務器端了解客戶端的狀態。
四,session和cookie誰更安全
就我的而言,我以爲session更安全一點,我如下幾點見解。
1,若是session和cookie同樣安全的話,兩者就沒有並要同時存在了,只要cookie就行了,讓客戶端來分提服務器的負擔,而且對於用戶來講又是透明的。何樂而不爲呢。
2,session的sessionID是放在cookie裏,要想功破session的話,第一要功破cookie。功破cookie後,你要獲得 sessionID,sessionID是要有人登陸,或者啓動session_start纔會有,你不知道何時會有人登陸。第二,sessionID是加密的,第二次session_start的時候,前一次的sessionID就沒有用了,session過時時sessionid也會失效,想在短期內功破加了密的 sessionID很難。session是針對某一次通訊而言,會話結束session也就隨着消失了,而真正的cookie存在於客戶端硬盤上的一個文本文件,誰安全很顯然了。
3,若是session這麼容易被功破,這麼不安全的話,我想現有的絕大部分網站都不安全了。
一、做用域控制對象
(1)做用
表示一個對象的存在範圍
(2)分類
A:當前jsp文件(當前jsp編譯生成的類文件)
page 默認的
特例:包含指令實現包含效果時,在被包含文件中聲明的對象。
B:具備明確請求傳遞關係的兩個jsp文件
request:利用屬性(一鍵一值)實現的對象存儲。
request中屬性存儲的對象信息,會在接受請求的文件執行完成後,自動清除。
使用場景:頁面轉發效果時,進行的值的傳遞。
C:客戶端信息的存儲方式
第一種:用戶(客戶端)信息存儲方式:用戶信息所有由客戶端實現存儲和管理。
第二種:服務器端的信息存儲。信息統一存儲到服務器上。
技術上的實現:
客戶端存儲方式:Cookie
服務器端的信息存儲:Session application
二、Cookie
(1)理解
「小甜餅」。存儲在客戶端機器瀏覽器臨時目錄中,實現用戶基本信息存儲的臨時文本文件。
(2)特徵
A:是文本文件
B:是臨時性的文本文件。
C:文件的大小通常不超過1K
D:存儲在瀏覽器的臨時目錄中
E:默認的,COOKIE對於瀏覽器不兼容,對WEB應用程序共享。
F:cookie以名稱與值的方式存儲用戶的基本信息。
G:存儲信息的做用域是:一個瀏覽器訪問的多個頁面
H:cookie會泄露用戶我的隱私
I:cookie是會被客戶端禁用的
(3)應用
A:建立cookie
Cookie cookie=new Cookie("名稱",「值」);
一個cookie只能存儲一個值,一個Cookie文件能夠存儲多個Cookie
B:指定cookie的生效期
明確cookie文件的存在時間。
cookie的分類:會話級ccokie和永久性cookie。
會話級cookie:cookie只在當前用戶訪問過程當中,在緩存中存在。用戶一退出,cookie自動清除。程序上的體現:不指定cookie的保存時間。
永久性cookie:一明確cookie的存在時間了,cookie文件就會在客戶端機器中建立。一建立,就認爲是永久性的。
cookie.setMaxAge(int)--->秒爲單位
C:輸出cookie
在客戶端創建文本
response.addCookie(cookie)
D:從客戶端得到Cookie
request.getCookies()---->數組。客戶端當前瀏覽器中全部cookie組成的集合。
如何查看服務器端輸送到咱們電腦中的這些Cookie信息:
點開IE瀏覽器或其餘瀏覽器,在菜單欄中有工具選項,點開有InterNet選項:
Cookie名稱、來源、文件格式(文本文件)、文件大小(1K以內)
Cookie有效期
(4)集合應用場景
cookie版的計數器:歡迎。。。光臨,這是您第?次訪問本站。
記錄客戶簡單的喜愛信息:亞馬遜
四、客戶端信息的跟蹤方式
如何識別客戶信息:
(1)利用cookie
(2)利用url重寫
(3)隱藏域
(4)session
五、session
(1)理解
會話。客戶端與服務器端的一組信息的交互。
(2)做用
在服務器緩存上,分配出來的,存儲單個用戶信息的空間。
(3)特色
A:session存儲的信息是在服務器的緩存上存儲的
B:每一個用戶,只要一訪問web應用(典型的登陸),服務器立刻會爲此用戶分配一個獨立的緩存空間。
C:每一個session。系統都會自動產生一個惟一標記的SessionID,用於區別。此id稱爲jsessionid、SessionID,以會話級cookie的方式存儲的客戶端緩存上。用於區分每個用戶。
D:session中能夠存儲任何的對象信息(典型的購物車)
E:session是有生效期的,執行的是會話超時的工做機制。Tomcat中默認時間是30分鐘。IIS中默認二十分鐘。
F:session中的信息,是在一個用戶在一個瀏覽器中的不一樣頁面上共享的(注意區別:Cookie是在同一個瀏覽器的全部頁面中能夠共享)。