關(guān)于Java Web會話處理如何工作的困惑。使用servlet API和HttpSession對象使Cookies和標(biāo)頭的差異變得神秘
您可以閱讀描述Cookies和相關(guān)標(biāo)頭Set-Cookie``Cookie的RFC,并了解它們是什么。
你可以通過在第7章Servlet規(guī)格,如果你想詳細(xì)了解如何cookie和session有關(guān)系。
您首先需要了解HTTP是無狀態(tài)協(xié)議。這意味著客戶端發(fā)出的每個請求都與任何先前或?qū)淼恼埱鬅o關(guān)。但是,作為用戶,我們非常希望在與Web應(yīng)用程序交互時(shí)具有某種狀態(tài)。例如,銀行應(yīng)用程序只希望您能夠查看和管理交易。音樂流媒體網(wǎng)站可能希望根據(jù)您已經(jīng)聽到的內(nèi)容推薦一些好的節(jié)奏。
為此,引入Cookie和Session概念。Cookies是鍵值對,但具有特定格式(請參閱鏈接)。會話是服務(wù)器端實(shí)體,用于存儲跨越服務(wù)器和客戶端之間的多個請求/響應(yīng)的信息(在內(nèi)存中或持久存儲)。
該ServletHTTP會話使用與名字的cookie JSESSIONID和值標(biāo)識會話。
該Servlet容器保持的地圖(YMMV)HttpSession對象和這些標(biāo)識符。當(dāng)客戶端第一次發(fā)出請求時(shí),服務(wù)器會創(chuàng)建一個HttpSession具有唯一標(biāo)識符的對象,并將其存儲在其映射中。然后Set-Cookie在響應(yīng)中添加標(biāo)題。它將cookie的名稱設(shè)置為,JSESSIONID并將其值設(shè)置為剛創(chuàng)建的標(biāo)識符。
這是服務(wù)器使用的最基本的Cookie。您可以根據(jù)需要設(shè)置任意數(shù)量的信息。該ServletAPI使用該HttpServletResponse#addCookie(Cookie)方法為您簡化了操作,但是您可以使用該HttpServletResponse#addHeader(String,String)方法自己完成操作。
客戶端接收這些cookie,并將其存儲在某個地方,通常存儲在文本文件中。向服務(wù)器發(fā)送新請求時(shí),它可以使用請求Cookie標(biāo)頭中的cookie來通知服務(wù)器它可能已經(jīng)完成了上一個請求。
當(dāng)Servlet容器收到請求時(shí),它將提取Cookie標(biāo)頭值,并嘗試HttpSession使用JSESSIONIDcookie中的鍵從其映射中檢索對象。這HttpSession則物體被連接到HttpServletRequest該對象Servlet容器創(chuàng)建并傳遞給你的Servlet。您可以使用setAttribute(String,Object)和getAttribute(String)方法來管理狀態(tài)。
解決方法我正在學(xué)習(xí)Spring安全性和Spring MVC,但是我意識到我需要首先學(xué)習(xí)jsp Servlet和Java環(huán)境中的常規(guī)Web編程。
我對HttpServletRequest和HttpServletResponse對象以及如何使用它們向請求和響應(yīng)對象添加標(biāo)頭以及它們與會話的關(guān)系感到困惑。
據(jù)我了解,Cookie就像Content-type和Accept一樣是一種標(biāo)頭。通過使用特定于使用標(biāo)頭的上下文的方法,java servletapi使得使用標(biāo)頭變得容易。例如:
response.setContentType(String mimeType)response.setContentLength(int lengthInBytes)
我的困惑從這里開始。Cookie不是String或int,它是一個對象:
response.addCookie(Cookie cookie)response.getCookies()
由于cookie是標(biāo)頭的一種,因此我不能只使用以下內(nèi)容:
String cookieVal = response.getHeader('cookie')
我很難理解會話管理及其與HttpServletRequest和HttpServletResponse API的關(guān)系。HttpSession對象的作用是什么?
HttpSession.getAttribute() // What is this getting??HttpSession.setAttribute('Bla Bla','valuetoset') // What is this setting?
相關(guān)文章:
1. 前端 - html5 audio不能播放2. java固定鍵值轉(zhuǎn)換,使用枚舉實(shí)現(xiàn)字典?3. vim - win10無法打開markdown編輯器4. mysql - 千萬數(shù)據(jù) 分頁,當(dāng)偏移量 原來越大時(shí),怎么優(yōu)化速度5. 如何解決tp6在zend中無代碼提示6. javascript - 有沒有類似高鐵管家的時(shí)間選擇插件7. 這是什么情況???8. python - flask學(xué)習(xí),user_syy添加報(bào)role is invalid keyword for User.9. css - BEM 中塊(Block)有木有什么標(biāo)準(zhǔn) 何時(shí)決定一個部分提取為塊而不是其父級的元素呢(Element)?~10. javascript - 微信網(wǎng)頁開發(fā)從菜單進(jìn)入頁面后,按返回鍵沒有關(guān)閉瀏覽器而是刷新當(dāng)前頁面,求解決?
