本文大綱java
HTTP Cookie(也稱爲Web cookie,瀏覽器cookie)是服務器在用戶瀏覽器中存儲的小部分數據。服務器端應用程序在返回瀏覽器請求響應的時候設置cookie,瀏覽器存儲cookie,並將它們在下一個請求一塊兒發送的時候自動帶回服務器端應用程序。spring
Cookies提供了一種在服務器和瀏覽器之間交換信息的方法,以管理會話(登陸,購物車,遊戲得分),記住用戶首選項(主題,隱私策略接受)以及跟蹤整個站點的用戶行爲。Cookies在必定程度上解放了服務器端的壓力,由於將一部分數據放在瀏覽器端存儲,因此這部分數據不能是涉及應用安全的數據。在本文中,咱們將學習如何在Spring Boot應用程序中讀取、設置和刪除HTTP cookie。數組
Spring框架提供@CookieValue
註釋來獲取HTTP cookie的值,此註解可直接用在控制器方法參數中。瀏覽器
@GetMapping("/") public String readCookie(@CookieValue(value = "username", defaultValue = "Atta") String username) { return "Hey! My username is " + username; }
在上述代碼段中,請注意defaultValue = "Atta"
。若是沒有設置默認值,而且沒有找到名稱爲username的Cookie,Spring將拋出java.lang.IllegalStateException
異常。安全
要在Spring Boot中設置cookie,咱們可使用HttpServletResponse
類的方法addCookie()
。您須要作的就是建立一個新的Cookie
對象並將其添加到響應中。springboot
@GetMapping("/change-username") public String setCookie(HttpServletResponse response) { // 建立一個 cookie對象 Cookie cookie = new Cookie("username", "Jovan"); //將cookie對象加入response響應 response.addCookie(cookie); return "Username is changed!"; }
除了使用@CookieValue
註解,咱們還可使用HttpServletRequest
類做爲控制器方法參數來讀取全部cookie。此類提供了getCookies()
方法,該方法以數組形式返回瀏覽器發送的全部cookie。服務器
@GetMapping("/all-cookies") public String readAllCookies(HttpServletRequest request) { Cookie[] cookies = request.getCookies(); if (cookies != null) { return Arrays.stream(cookies) .map(c -> c.getName() + "=" + c.getValue()) .collect(Collectors.joining(", ")); } return "No cookies"; }
若是沒有爲cookie指定過時時間,則其生命週期將持續到Session過時爲止。這樣的cookie稱爲會話cookie。會話cookie保持活動狀態,直到用戶關閉其瀏覽器或清除其cookie。可是您能夠覆蓋此默認行爲,並使用類的setMaxAge()
方法設置cookie的過時時間。cookie
// 建立一個 cookie對象 Cookie cookie = new Cookie("username", "Jovan"); cookie.setMaxAge(7 * 24 * 60 * 60); // 7天過時 //將cookie對象加入response響應 response.addCookie(cookie);
如今,username
Cookie不會由於Seesion結束到期,而是會在接下來的7天保持有效。傳遞給setMaxAge()
方法的到期時間以秒爲單位。到期日期和時間是相對於設置cookie的客戶端而不是服務器而言的。app
咱們須要瞭解一個概念:什麼的安全的Cookies?安全的cookie是僅能夠經過加密的HTTPS鏈接發送到服務器的cookie。沒法經過未加密的HTTP鏈接將cookie發送到服務器。也就是說,若是設置了setSecure(true),該Cookie將沒法在Http鏈接中傳輸,只能是Https鏈接中傳輸。框架
// 建立一個 cookie對象 Cookie cookie = new Cookie("username", "Jovan"); cookie.setSecure(true); //Https 安全cookie //將cookie對象加入response響應 response.addCookie(cookie);
HttpOnly cookie用於防止跨站點腳本(XSS)攻擊,也就是說設置了Http Only的Cookie不能經過JavaScript的Document.cookie
API訪問,僅能在服務端由服務器程序訪問。
// 建立一個 cookie對象 Cookie cookie = new Cookie("username", "Jovan"); cookie.setHttpOnly(true); //不能被js訪問的Cookie //將cookie對象加入response響應 response.addCookie(cookie);
要刪除Cookie,須要將Max-Age
設置爲0,而且將Cookie的值設置爲null。不要將Max-Age
指令值設置爲-1
負數。不然,瀏覽器會將其視爲會話cookie。
// 將Cookie的值設置爲null Cookie cookie = new Cookie("username", null); //將`Max-Age`設置爲0 cookie.setMaxAge(0); response.addCookie(cookie);