响应设置cookie_注册登录 与 Cookie
開始之前,我們先簡單了解一下 注冊/登錄 的流程。(無代碼)
上面過程中,有一個注意點:
為什么前端和后端都要驗證一遍用戶填入的信息?
首先我們要知道,前端其實是可以不用驗證用戶填入的信息的,但是后端一定要驗證。
但是如果前端不驗證的話,就要發送一個請求給后端,讓后端驗證,如果后端驗證失敗,又要發個響應給前端。這無形中增加了請求和響應,也就給服務器增添了負擔,不利于網絡性能優化。所以最好讓前端先把用戶信息驗證好,如果用戶填入的信息沒有問題,再將信息發送給后端。這樣就不用來回的發送請求和響應。
另外,有些人可能會通過命令行,使用 curl 來訪問服務器,這樣一來就直接繞過了前端,直接訪問后端。如果后端不驗證,那么就可能出現安全問題了。
以上是注冊登錄的簡單版本,實際工作中,會比這復雜的多。
下面有兩張流程圖,可以清晰看出 注冊/登錄 的流程。
注冊登錄圖片來自 segmentfault 。
我們都知道,一個網站,你登錄了和沒登錄,看到的頁面是不一樣的。
那么服務器是如何區分你是登錄了還是沒登錄呢?或者你登錄了以后,跳轉到其他頁面,其他頁面是怎么知道你是已經登錄的狀態呢?這就需要用到 Cookie 了。
Cookie
什么是 Cookie?Cookie 是服務器通過 HTTP 響應,寫入瀏覽器的一小段文本信息。
為什么要使用Cookie?Cookie 主要用來分辨兩個請求是否來自同一個瀏覽器,以及用來保存一些狀態信息。
分辨請求是否來自同一個瀏覽器:
比如,你的電腦上同時安裝了 Chrome 瀏覽器和 Safari 瀏覽器。當你用 Chrome 登錄知乎后,再使用 Safari 登錄時,會要求你重新登錄。這是因為,服務器給 Chrome 的 Cookie 和 給 Safari 的 Cookie 是不一樣的。就好比,你和你弟弟去游樂園玩,游樂園會給你們兩張票,一張對你有用,一張對你弟弟有用,你不能用你弟弟的票,你弟弟也不能用你的票。
保存一些狀態信息:
比如,你登錄知乎后,在一段時間內,即使你關閉了瀏覽器,當再次打開知乎時,可以不用登錄。這是因為,Cookie 中包含了“過期時間”,只要你在“過期”以前重新打開知乎,就可以不用登錄。就好比,游樂園的門票的有效期為兩天,在這兩天時間內,不管你干嘛,哪怕你出園了,當你再次進入游樂園時,檢票員發現你的票還沒有過期,你就可以直接進入游樂園,不用再次買票。
怎么寫 Cookie?Cookie 是服務器寫入瀏覽器的一小段文本信息,形如:
response.setHeader('Set-Cookie', 'userName=dongdong; password=123') // 返回給瀏覽器的 Cookie 記錄了用戶名和密碼當然,服務器也可以設置多個 Cookie ,那么 HTTP 響應中就會包含多個 Set-Cookie 字段:
HTTP/1.1 200 OK Content-type: text/html Set-Cookie: a=1 Set-Cookie: b=2[page content]瀏覽器向服務器發送請求時,就會帶上這段文本信息,形如:
GET /xxx.html HTTP/1.1 Host: www.example.org Cookie: userName=dongdong; password=123 // 瀏覽器帶上的 Cookie 有用戶名和密碼這樣一來,服務器只要讀取瀏覽器帶上的 Cookie(票拿來給我看看),然后和服務器中的數據做對比(檢查票上的信息),如果驗證通過,就可以訪問。
Cookie 的屬性Expires,Max-Age
上面說到,Cookie 是有過期時間的。在服務器,我們可以通過 Expires 和 Max-Age 兩個屬性來設置。如:
response.setHeader('Set-Cookie', 'expires=Wed, 21 Oct 2015 07:28:00 GMT') response.setHeader('Set-Cookie', 'max-age=30')上面代碼中,分別通過 Expires 和 Max-Age 屬性來設置過期時間,那么這兩個有什么區別呢?
- Expires 設置的是具體的過期時間,比如 xxx 年 xxx 月 xxx 日 xx : xx : xx ,到了這個時間后,Cookie 就會被刪除;
- Max-Age 設置的是從現在開始 Cookie 存在的秒數,比如有效期為 30s,30s 后,Cookie 就會被刪除。
如果同時指定了 Expires 和 Max-Age,那么 Max-Age 的值將優先生效。
如果沒有指定這兩個屬性,那么這個 Cookie 就是 Session Cookie,只在當前會話(Session)有效,如果關閉瀏覽器,那么 Cookie 就會被刪除。
Secure,HttpOnly
Secure 和 HttpOnly 屬性,可以不用指定屬性值,如:
response.setHeader('Set-Cookie', 'Secure') response.setHeader('Set-Cookie', 'HttpOnly')Secure 屬性指定瀏覽器只有在 HTTPS 協議下,才能將 Cookie 發送給服務器。另外,如果協議是 HTTP,那么瀏覽器會自動忽略服務器發來的 Secure 屬性。換句話說,Secure 只在 HTTPS 協議下有效。
HttpOnly 屬性指定只有在瀏覽器發出請求時,才會帶上該 Cookie,該 Cookie 無法通過 JavaScript 腳本拿到。
比如通過 document.cookie 可以拿到當前網頁的 Cookie:
document.cookie // "foo=bar;baz=bar"但是如果該 Cookie 設置了 HttpOnly 屬性,那就無法拿到 Cookie。
END~~
總結
以上是生活随笔為你收集整理的响应设置cookie_注册登录 与 Cookie的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 内存单元操作
- 下一篇: 详细讲解Hyper-V虚拟机的网络配置