session和cookie到底有什么联系?这一篇文章给你分析的明明白白~
目錄
存儲讀取session測試
5.如何用java獲取請求和響應(yīng)中HttpHeaders的Cookie呢?
session和cookie的區(qū)別:
cookie是存儲在本地?cái)?shù)據(jù);session是存儲在服務(wù)器上的數(shù)據(jù)。
存儲讀取session測試
1.先寫兩行代碼,在同一個服務(wù)器下,先后存儲session和取session。
@RequestMapping("testSession1")public void testSession1(){//存儲sessionrequest.getSession().setAttribute("test", "content");System.out.println("存儲test的值為content");}@RequestMapping("testSession2")public void testSession2(){//打印上次存儲的sessionSystem.out.println(request.getSession().getAttribute("test"));}2.用瀏覽器分別請求這兩個請求。
顯示結(jié)果: 存儲test的值為content content原因分析:瀏覽器自從將服務(wù)器端返回的cookie保存了起來,下次再訪問同一個服務(wù),就會帶著之前的cookie訪問,來證明是同一個用戶。
3.用postman分別請求這兩個請求。(postman自帶cookie,如果JSESSIONID相同的話,服務(wù)器端也會認(rèn)為這是同一個用戶發(fā)起的兩個請求,所以請求結(jié)果和用瀏覽器一樣)
請求結(jié)果:
存儲test的值為content content4.用redisTemplate或者h(yuǎn)ttpClient分別請求,因?yàn)檎埱蟮腍eaders中不包含Cookie,所以被服務(wù)器端認(rèn)作不同用戶的請求,所以第二個請求session取不到。
5.如何用java獲取請求和響應(yīng)中HttpHeaders的Cookie呢?
//獲取響應(yīng)的Cookie HttpHeaders headers = restTemplate.exchange(url, HttpMethod.GET, requestEntity, String.class).getHeaders(); List<String> cookies = headers.get("Set-Cookie");//向請求header放cookie HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.put("Cookie", cookies); HttpEntity<String> requestEntity2 = new HttpEntity<String>(null, httpHeaders); restTemplate.exchange(url2, HttpMethod.GET, requestEntity2, String.class);//獲取cookie public static List<String> getCookieList(HttpServletRequest request) {List<String> cookieList = new ArrayList<>();Cookie[] cookies = request.getCookies();if (cookies == null || cookies.length == 0) {return cookieList;}for (Cookie cookie : cookies) {cookieList.add(cookie.getName() + "=" + cookie.getValue());}return cookieList; }6.cookie的格式
根據(jù)Netscape公司的規(guī)定,Cookie格式如下:
Set-Cookie: NAME=VALUE;Expires=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURE
NAME=VALUE:
這是每一個Cookie均必須有的部分。NAME是該Cookie的名稱,VALUE是該Cookie的值。在字符串“NAME=VALUE”中,不含分號、逗號和空格等字符。
Expires=DATE:Expires變量是一個只寫變量,它確定了Cookie有效終止日期。該屬性值DATE必須以特定的格式來書寫:星期幾,DD-MM-YY HH:MM:SS GMT,GMT表示這是格林尼治時間。反之,不以這樣的格式來書寫,系統(tǒng)將無法識別。該變量可省,如果缺省時,則Cookie的屬性值不會保存在用戶的硬盤中,而僅僅保存在內(nèi)存當(dāng)中,Cookie文件將隨著瀏覽器的關(guān)閉而自動消失。
Domain=DOMAIN-NAME:Domain該變量是一個只寫變量,它確定了哪些Internet域中的Web服務(wù)器可讀取瀏覽器所存取的Cookie,即只有來自這個域的頁面才可以使用Cookie中的信息。這項(xiàng)設(shè)置是可選的,如果缺省時,設(shè)置Cookie的屬性值為該Web服務(wù)器的域名。
Path=PATH:Path屬性定義了Web服務(wù)器上哪些路徑下的頁面可獲取服務(wù)器設(shè)置的Cookie。一般如果用戶輸入的URL中的路徑部分從第一個字符開始包含Path屬性所定義的字符串,瀏覽器就認(rèn)為通過檢查。如果Path屬性的值為“/”,則Web服務(wù)器上所有的WWW資源均可讀取該Cookie。同樣該項(xiàng)設(shè)置是可選的,如果缺省時,則Path的屬性值為Web服務(wù)器傳給瀏覽器的資源的路徑名。
可以看出我們借助對Domain和Path兩個變量的設(shè)置,即可有效地控制Cookie文件被訪問的范圍。
Secure:在Cookie中標(biāo)記該變量,表明只有當(dāng)瀏覽器和Web Server之間的通信協(xié)議為加密認(rèn)證協(xié)議時,瀏覽器才向服務(wù)器提交相應(yīng)的Cookie。當(dāng)前這種協(xié)議只有一種,即為HTTPS。
7.cookie如何存儲JSESSIONID?
https://blog.csdn.net/chunqiuwei/article/details/23461995
總結(jié)
以上是生活随笔為你收集整理的session和cookie到底有什么联系?这一篇文章给你分析的明明白白~的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学习dos批处理,再也不怕老板安排一些重
- 下一篇: 这是我见过解释java内部类最详细的一篇