登陸界面,用戶提交後,後臺獲取到用戶名密碼,而後會設置cookie,以便於前端使用,今天在修改項目記住密碼的功能的時候,讀取cookie,若是存在loginInfo字段說明用戶在上一次點擊了記住密碼的功能,那麼就會解析loginInfo的值來動態填充input輸入框,寫程序幾行代碼搞定了,可是測試的時候發現有一個帳戶在讀取cookie的時候總會對一個雙引號" ",找了半天也沒找到緣由,而線上已發佈的版本卻沒有這個問題,找了很久才發如今這個出問題的帳戶密碼出現了!@#這三個特殊符號:前端
document.cookie=> "loginInfo="admin123/admin!@#" " 這種解析的cookie ,等於號後邊會先用一個字符串包裹,不含上面!@#的帳戶解析出來是這樣的:瀏覽器
document.cookie=> "loginInfo=ceshi01/ceshi000000" , 能夠發現正常顯示應該是這樣key=value,而不是key=「value」;tomcat
後來閱讀資料發現:cookie
cookie是分兩個版本一個是version 0,這個版本是被全部瀏覽器所接受的,另外一個是version 1,關鍵區別是version 1的cookie內容能夠放些特殊的字符,例如:空格,方括號,圓括號,等於號(=),逗號,雙引號,斜槓,問號,@符號,冒號,分號。函數
version 0不行.測試
tomcat6.0.16的cookie內容不能用雙引號包含,tomcat6.0.18存放cookie內容能夠用雙引號包含,這樣的好處就是避 免了取含有特殊字符的值時,取出來的值是不完整的,cookie內容帶有=符號時,就是發生取值不完整的狀況!編碼
這也就說明爲什麼!@#的帳號會出現雙引號,線上版本正常,本地的環境下就會出現錯誤,由於線上的tomcat和本地的不同,線上是不會攜帶""。spa
解決辦法:code
後臺設置cookie的時候encode,對帳號密碼進行編碼,能夠將 !@#這些字符轉換成編碼形式%21 %40 %23,前端讀取的時候在解碼將%21%40%23解析爲!@#。字符串
前端解碼decodeURI,decodeURIComponent ,可是使用中decodeURI()沒法解析@#這兩個符號,由於:encodeURI() 函數是不會對這幾個符號轉義的:;/?:@&=+$,#;
因此用decodeURIComponent就解決了雙引號的問題。