本文目錄一覽:
- 1、cookie默認有效期多長_驚艷面試官的 Cookie 介紹
- 2、如何使cookie全站都生效
- 3、cookie刷新才能生效
- 4、如何設置cookie的有效期
- 5、javascript 寫cookie立即生效問題
cookie默認有效期多長_驚艷面試官的 Cookie 介紹
Cookie 是什麼
Cookie 是用戶瀏覽器保存在本地的一小塊數據,它會在瀏覽器下次向 同一伺服器 再發起請求時被攜帶並發送到伺服器上。
Cookie 主要用於以下三個方面:
會話狀態管理(如用戶登錄狀態、購物車、遊戲分數或其它需要記錄的信息)
個性化設置(如用戶自定義設置、主題等)
瀏覽器行為跟蹤(如跟蹤分析用戶行為等)
✔ Domain
Domain 標識指定了哪些主機可以接受 Cookie。如果不指定,默認為當前文檔的主機(不包含子域名)。 如果指定了 Domain,則一般包含子域名(子域名可以訪問父域名的 Cookie) 。
例如,如果設置 Domain=mozilla.org,則 Cookie 也包含在子域名中(如 developer.mozilla.org)。
✔ Path
Path 標識指定了主機下的哪些路徑可以接受 Cookie(該 URL 路徑必須存在於請求 URL 中)。以字元 %x2F (/) 作為路徑分隔符,子路徑也會被匹配。
設置 Path=/docs,則以下地址都會匹配:
/docs
/docs/Web/
/docs/Web/HTTP
✔ Expires/Max-Age
Cookie 的過期時間,過了這個時間之後 Cookie 將會自動刪除。
Set-Cookie:id=a3fWa; Expires=Wed,21Oct201507:28:00GMT;
Max-Age 的單位是秒。
document.cookie=’promo_shown=1; Max-Age=2600000; Secure’
✔ HttpOnly
為避免跨域腳本 (XSS) 攻擊,通過 JavaScript 的 Document.cookie API 無法訪問帶有 HttpOnly 標記的 Cookie,它們只應該發送給服務端。如果包含服務端 Session 信息的 Cookie 不想被客戶端 JavaScript 腳本調用,那麼就應該為其設置 HttpOnly 標記。
Set-Cookie:id=a3fWa; Expires=Wed,21Oct201507:28:00GMT; Secure; HttpOnly
✔ Secure
標記為 Secure 的 Cookie 只應通過 被 HTTPS 協議加密 過的請求發送給服務端。
SameSite
…
…
SameSite Cookie 允許伺服器要求某個 Cookie 在跨站請求時不會被發送,從而可以阻止跨站請求偽造攻擊(CSRF)。
Set-Cookie:key=value; SameSite=Strict
None 瀏覽器會在同站請求、跨站請求下繼續發送 Cookies,不區分大小寫;
Strict 瀏覽器將只發送相同站點請求的 Cookie(即當前網頁 URL 與請求目標 URL 完全一致)。如果請求來自與當前 location 的 URL 不同的 URL,則不包括標記為 Strict 屬性的 Cookie;
Lax 在新版本瀏覽器中,為 默認 選項,Same-site Cookies 將會為一些跨站子請求保留,如 圖片載入 或者 iframe 不會發送,而點擊 標籤會發送;
✔ 增刪改查
…
設置 Cookie 和修改 Cookie 相同:
functionsetCookie(cname, cvalue, exdays) {constd =newDate() d.setTime(d.getTime() + exdays *24*60*60*1000)constexpires =’expires=’+ d.toUTCString()return(document.cookie= cname +’=’+ cvalue +’;’+ expires +’;path=/’)}
刪除 Cookie:
functiondeleteCookie(cname) {constd =newDate()constexpires =’expires=’+ d.toUTCString()return(document.cookie= cname +’=’+’;’+ expires +’;path=/’)}
查詢 Cookie:
functiongetCookie(cname) {constcookieObj =document.cookie.split(‘;’).reduce((prev, curr) ={constentry = curr.split(‘=’) prev[entry[0].trim()] = entry[1]returnprev }, {})if(cname)returncookieObj[cname]returncookieObj}
✔ 不同二級域名共享 Cookie
Cookie 可以設置成給子域名共享,類似於在 x.com.cn 設置的 Cookie 可以提供給 a.x.com.cn、b.x.com.cn、suba.a.x.com.cn 等域名訪問。
比如下面的方式:
res.writeHead(200, {‘Set-Cookie’: [‘name=sub-x-com-cn; path=/;domain=x.com.cn’,’name=only-x-com-cn; path=/’],})
domain=x.com.cn 表示 domain=x.com.cn 及其子域名都可以使用, 不寫 doamin 默認只有當前域名可用,設置的 Cookie 是這樣的:
總結
設置 Cookie 時,在 x.com.cn 設置為 …;domain=x.com.cn 的 Cookie 可以給 x.com.cn 及其子域名使用;
設置 Cookie 時,在 x.com.cn 設置沒有 domain 的 Cookie 只能給 x.com.cn 使用;
父域名無法在子域名設置 Cookie ,例如在 x.com.cn 設置了 name=lxfriday;domain=subx.x.com.cn,這種設置是無效的;
✔ Cookie 常見問題
Cookie 不區分埠;
一個 Cookie 存儲上限是 4K 大小;
Cookie 只能存儲 ASCII 字元串;
✔ Cookie 安全-會話劫持和 XSS
newImage().src=”+document.cookie
HttpOnly 類型的 Cookie 由於阻止了 JavaScript 對其的訪問性而能在一定程度上緩解此類攻擊。
✔ Cookie 安全-跨站請求偽造(CSRF)
當你打開含有了這張圖片的 HTML 頁面時,如果你之前已經登錄了你的銀行帳號並且 Cookie 仍然有效(還沒有其它驗證步驟),你銀行里的錢很可能會被自動轉走。
這種情況只是一種假設,實際上應該不允許使用 GET 修改數據,對轉賬的操作需要添加二次確認。
✔ Session
Session 機制是一種伺服器端的機制,伺服器使用一種類似於散列表的結構(也可能就是使用散列表)來保存信息。
當程序需要為某個客戶端的請求創建一個 Session 時,伺服器首先檢查這個客戶端的請求里是否已包含了一個 Session 標識(稱為 Session ID),如果已包含則說明以前已經為此客戶端創建過 Session,伺服器就按照 Session ID 把這個 Session 檢索出來使用(檢索不到,會新建一個),如果客戶端請求不包含 Session ID,則為此客戶端創建一個 Session 並且生成一個與此 Session 相關聯的 Session ID,Session ID 的值應該是一個 既不會重複,又不容易被找到規律以仿造的字元串 ,這個 Session ID 將被在本次響應中返回給客戶端保存。
Session 從客戶端傳輸到服務端的方式有兩種:
通過 Cookie 傳輸;
通過 URL 傳輸;
表單隱藏欄位,通過在 中添加一個隱藏欄位,把 Session 傳回伺服器;
基於 Cookie 實現,會話期 Cookie 是最簡單的 Cookie: 瀏覽器關閉之後它會被自動刪除,也就是說它僅在會話期內有效 。會話期 Cookie 不需要指定過期時間(Expires)或者有效期(Max-Age)。
Set-Cookie: name=lxfriday.xyz; path=/;HttpOnly
✔ Cookie 與 Session 有什麼不同
mp.weixin.qq.com/s?__biz=MzA…
保存的地方不同 ,Cookie 保存在客戶端,Session 保存在服務端;
有效期不同 ,Cookie 可以存儲很長時間,Session 只能存在於一次會話中,瀏覽器關閉之後 Session 就失效了;
安全性不同 ,Cookie 存儲在客戶端容易被盜取或者利用,Session 在服務端比較安全;
存儲大小不同 ,單個 Cookie 能存儲 4K 的數據,Session 存儲量比 Cookie 高得多;
存取方式不同 ,Cookie 中只能保存 ASCII 字元串 ,假如需求存取 Unicode 字元或者二進位數據,需求先進行編碼。Session 中能夠存取 任何類型 的數據;
伺服器壓力不同 ,Session 是存儲在服務端的,巨大並發的時候會使伺服器資源急速飆升。Cookie 則不存在此問題;
鏈接:
如何使cookie全站都生效
以 setcookie(‘name’, “Garen”);echo $_COOKIE[‘name’];為例;第一次訪問在執行setcookie(‘name’,”Garen”);之前,PHP已經從請求體重獲取所有的cookie(在$_COOKIE中),然後到setcookie(‘name’,”Garen”);的時候,只是設置了名為name的cookie;這部只是保存進瀏覽器,但是並沒有賦值給$_COOKIE,$_COOKIE並沒有變化,所有也就沒有$_COOKIE[‘name’],執行到echo$_COOKIE[‘name’];就會報錯.第2次訪問獲取瀏覽器中所有的cookie時,已經有了上次添加的這個名為name的cookie了,所以可以顯示
cookie刷新才能生效
永遠記住,對COOKIE的賦值只有等下一次瀏覽請求時才能生效。如果想達到你那樣的功能請用變數來實現。我給出php的示例代碼:
$val_cookie=”xx”;
function fun1()
{
setcookie(“c_1”,$val_cookie,time()+3600);//設置下標名為c_1的cookie
$val_cookie;//若此時就要用剛剛賦進cookie的值,請用這個變數
}
function fun2()
{
$val_cookie;//和上邊一樣
}
如何設置cookie的有效期
你是用戶還是開發者啊 要是用戶不想使用自動登錄就把瀏覽器的安全級別設置成最高 保證會讓你很滿足 一天登錄n次你就會享受輸n次密碼的快感。
如果是開發者那就可以兩種方式設置cookie有效期了:javascript設置和伺服器腳本語言設置(有php或者java或者asp或者.NET)
js是這樣設置的:
function zxmcook(name,value,time){ //函數名字自己隨意定義,zxm是哥哥我名字,你就不要鬱悶了
var exp=new Date();
exp.setTime(exp.getTime()+time*60*24*60*1000); //這裡的time就是天數
document.cookie=name+”=”+escape(value)+”;expires=”+exp.toGMTString();
}
zxmcook(“mn”,”zxm”,1)//這就是一天
ok就這樣了 累死我了
然後php或者java或者asp或者.NET就不說了 並且每個人只會選擇一種的,哥不願意說了半天咱兩跑偏了 我搞的是php,結果你是java那樣多尷尬啊,不過我怎麼現在感覺怪怪的,你如果是開發者不會為了搞清楚個cookie跑這兒問半天,網上一搜就是一片,所以我預感咱兩百分之90都跑偏了
javascript 寫cookie立即生效問題
應該說這個是一個很奇怪的問題,看樓主的描述我也沒明白什麼原因
但是可以做這樣的一些測試來定位問題
1. 是否是瀏覽器的問題
可以分別測試ie,firefox來判別是否是瀏覽器的問題
2. 判斷你的js設置cookie是否成功
你可以多些一些js腳本,在你設置完cookie後立馬讀取出來,看看設置是否生效了
3. 如果上面都沒有問題,再看看網路傳輸
在你輸入「其它網址」的時候用抓包工具如(firebug,httpwatch)查看那個請求,你可以再該請求的cookie段裡頭找,看看該請求是不是帶上了你設置的cookie
4. 如果這些都正確了
那你就確認一下你的asp程序讀取cookie的方法是否正確
我想樓主能夠按以上4個步驟來測試,應該是能夠把問題定位下來了
祝好運!
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/259530.html