前陣子,接一個用戶授權服務時,遇到一個關於cookie的詭異問題,折騰了一天才知道問題出在哪兒,雖然時候才知道這是個小白問題。
遇到問題是這樣子:
比如訪問A地址(比如http://localhost/index,http://localhost/test/index)時需要登陸時會跳轉到一個登陸頁面,登陸成功后,跳轉回原頁面,這時將用戶信息存入到session中,並通過response的Set-Cookie頭信息,設置向對應的cookie值。具體如下:
Set-Cookie:sid=Wnse42HlgkYBbLtAEOMRkXcWHSwkr9nRUS0WBFFHA4TCZUga; Max-Age=28800; Expires=Mon, 18 Mar 2013 12:07:32 GMT;
乍一看沒有問題吧?
當A地址是在一級目錄,比如http://localhost/index,這樣是沒有任何問題的。
但A地址是在二級目錄,比如http://localhost/test/index,問題就來了。訪問過A后再去訪問其他層級的目錄,比如http://localhost/test2/index,這時是得不到用戶的cookie信息,就好像之前的登陸無效一樣。
現在大家應該清楚問題處在哪了?cookie的作用域問題。
解決方法也很簡單,指定全局的作用域
Set-Cookie:sid=Wnse42HlgkYBbLtAEOMRkXcWHSwkr9nRUS0WBFFHA4TCZUga; Max-Age=28800; Expires=Mon, 18 Mar 2013 12:07:32 GMT; Path=/;
這里很重要的一點是:正常的cookie只能在一個應用中(簡單理解,就是一個目錄)共享,即一個cookie只能由創建它的應用獲得,比如在/test1/*創建自己應用的cookie,/test2/*下是拿不到。而且很容易被忽視的一點:path默認是產生cookie的應用的路徑。
如果兩者需要共享的話,指定Path為"/"即可
所以以前千萬不要為了省事,而不設置一些重要的參數,不然......
具體的測試代碼可見:https://github.com/jifeng/toycode/blob/master/cookie/path.js