日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

初学Java Web(5)——cookie-session学习

發(fā)布時(shí)間:2025/3/21 java 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 初学Java Web(5)——cookie-session学习 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

HTTP 協(xié)議

Web 瀏覽器與?Web 服務(wù)器之間的一問一答的交互過程必須遵守一定的規(guī)則,這樣的規(guī)則就是?HTTP 協(xié)議。

HTTP?是?hypertext transfer protocol(超文本傳輸協(xié)議)的簡(jiǎn)寫,它是?TCP/IP 協(xié)議之上的一個(gè)應(yīng)用層的協(xié)議,用于定義 Web 瀏覽器與 Web 服務(wù)器之間交互數(shù)據(jù)的過程以及數(shù)據(jù)本身的格式。

  • 特點(diǎn):無狀態(tài),默認(rèn)端口 80

HTTP 協(xié)議到底約束了什么?

  • 約束了瀏覽器以何種格式向服務(wù)端發(fā)送數(shù)據(jù)
  • 約束了服務(wù)器應(yīng)該以何種格式接收客戶端發(fā)送的數(shù)據(jù)
  • 約束了服務(wù)器應(yīng)該以何種格式反饋數(shù)據(jù)給瀏覽器
  • 約束了瀏覽器應(yīng)該以何種格式接收服務(wù)器的反饋數(shù)據(jù)
    • 總結(jié):
      瀏覽器給服務(wù)器發(fā)送數(shù)據(jù):一次請(qǐng)求
      服務(wù)器給瀏覽器反饋數(shù)據(jù):一次響應(yīng)

    HTTP 無狀態(tài)協(xié)議

    HTTP?是一個(gè)無狀態(tài)的協(xié)議,也就是沒有記憶力,這意味著每一次的請(qǐng)求都是獨(dú)立的,缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須要重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。另一方面,在服務(wù)器不需要先前信息時(shí)它的應(yīng)答就很快。

    HTTP?的這種特性有優(yōu)點(diǎn)也有缺點(diǎn):

    • 優(yōu)點(diǎn):解放了服務(wù)器,每一次的請(qǐng)求“點(diǎn)到為止”,不會(huì)造成不必要的連接占用。
    • 缺點(diǎn):每次請(qǐng)求會(huì)傳輸大量重復(fù)的內(nèi)容信息,并且,在請(qǐng)求之間無法實(shí)現(xiàn)數(shù)據(jù)的共享。

    主要問題:請(qǐng)求之間無法實(shí)現(xiàn)數(shù)據(jù)的共享

    • 解決方案:
      1.使用參數(shù)傳遞機(jī)制:
      將參數(shù)拼接在請(qǐng)求的 URL 后面,實(shí)現(xiàn)數(shù)據(jù)的傳遞(GET方式),例如:/param/list?username=wmyskxz
      問題:可以解決數(shù)據(jù)共享的問題,但是這種方式一不安全,二數(shù)據(jù)允許傳輸量只有1kb
      2.使用Cookie技術(shù)
      3.使用Session技術(shù)

    • 特點(diǎn):客戶端的技術(shù),將共享數(shù)據(jù)保存在客戶端(瀏覽器)中

    英文直接翻譯過來就是小甜品,Cookie 的作用呢,通俗的說就是當(dāng)一個(gè)用戶通過?HTTP?訪問一個(gè)服務(wù)器時(shí),這個(gè)服務(wù)器會(huì)將一些?Key/Value 鍵值對(duì)返回給客戶端瀏覽器,并給這些數(shù)據(jù)加上一些限制條件,在條件符合時(shí)這個(gè)用戶下次訪問這個(gè)服務(wù)器時(shí),數(shù)據(jù)又被完整地帶回給服務(wù)器。

    這個(gè)作用就像是你去超市購(gòu)物時(shí),第一次給你辦了一張購(gòu)物卡,在這個(gè)購(gòu)物卡里存放了一些你的個(gè)人信息,下次你再來這個(gè)超市的時(shí)候,你就只需要帶上你的購(gòu)物卡,直接購(gòu)物就好了。

    Cookie 操作

  • 創(chuàng)建 Cookie 對(duì)象,設(shè)置共享數(shù)據(jù)
  • Cookie c = new Cookie(String name,String value); // 相當(dāng)于辦卡
    • 注意:一個(gè)Cookie只能存儲(chǔ)一個(gè)字符串類型的數(shù)據(jù),不能存儲(chǔ)其他類型的數(shù)據(jù)
  • 將 Cookie 響應(yīng)給瀏覽器
  • response對(duì)象.addCookie(cookie對(duì)象) // 相當(dāng)于把卡交給用戶
  • 獲取請(qǐng)求中的 Cookie 信息
  • Cookie[] cs = request對(duì)象.getCookies(); for(Cookie c : cs){if(“username”.equals(c.getName())){String value = c.getValue();} }
  • 修改 Cookie 中的共享數(shù)據(jù)
    1.重新創(chuàng)建一個(gè)新的 Cookie,名稱要和要修改的數(shù)據(jù)一致
    2.現(xiàn)獲取到要修改的 Cookie 對(duì)象,再調(diào)用?setValue(String newValue)?重新設(shè)置
    • 注意:修改 Cookie 中的數(shù)據(jù),需要再次發(fā)送給瀏覽器(第2點(diǎn))
  • 操作 Cookie 的生命周期
    • 默認(rèn):在關(guān)閉瀏覽器的時(shí)候銷毀 Cookie 對(duì)象
    • 語(yǔ)法:void setMaxAge(int expiry)
      expiry > 0:設(shè)置 Cookie 對(duì)象能夠存活 expiry 秒,即使關(guān)閉瀏覽器,也不影響 Cookie 中的共享數(shù)據(jù),比如設(shè)置一個(gè)月:setMaxAge(60*60*24*30);
      expiry = 0:立即刪除當(dāng)前的 Cookie 信息
      expiry < 0:關(guān)閉瀏覽器時(shí)銷毀
  • 刪除 Cookie 中的共享數(shù)據(jù)
    通過setMaxAge(0)來實(shí)現(xiàn)

  • Cookie 中的 key 和 value 不支持中文
    設(shè)置 Cookie 時(shí)需要對(duì)中文字符串進(jìn)行編碼:
    java Cookie c = new Cookie("username", URLEncoder.encode(username,"UTF-8"));
    在獲取 Cookie 數(shù)據(jù)的時(shí)候再進(jìn)行解碼:
    java username = URLDecoder.decode(value, "UTF-8");
  • Cookie 的路徑和域范圍
    • Cookie 的路徑
      Cookie 在創(chuàng)建的時(shí)候,會(huì)根據(jù)當(dāng)前的Servlet的相對(duì)路徑來設(shè)置自己的路徑,比如 Servlet 的url-pattern為?/cookie/login,相對(duì)路徑則為:/cookie/
      • 出現(xiàn)的問題:
        只有在訪問路徑為?/cookie/?下面的資源的時(shí)候,才會(huì)將該 Cookie 發(fā)送到服務(wù)器
      • 解決方案:
        設(shè)置 Cookie 的路徑:void setPath(String uri)
        Cookie對(duì)象.setPath("/");?表示當(dāng)前應(yīng)用中的所有的資源都能夠共享該Cookie信息
    • 域范圍:(了解)
      在多個(gè)應(yīng)用之間實(shí)現(xiàn)數(shù)據(jù)的共享,那么就需要設(shè)置域范圍,比如:
      www.baidu.com / news.baidu.com / map.baidu.com
    • 語(yǔ)法:Cookie對(duì)象.setDomain("baidu.com");

    Cookie 的缺陷

    Cookie 的作用其實(shí)就是一種會(huì)話跟蹤技術(shù),但存在一些缺陷:

  • 獲取 Cookie 信息比較麻煩
  • Cookie?不支持中文
  • 一個(gè) Cookie 只能存儲(chǔ)一個(gè)字符串類型的數(shù)據(jù)
  • Cookie 在瀏覽器中有大小和數(shù)量上的限制(不同瀏覽器存在不同的限制,例如FireFox一個(gè)站點(diǎn)最多存儲(chǔ)50個(gè) Cookie ,瀏覽器最多存儲(chǔ) 4097個(gè)字大小的 Cookie)
  • 共享數(shù)據(jù)時(shí)保存在瀏覽器中,容易造成數(shù)據(jù)的泄露,不安全
    • 最好的解決方案:將數(shù)據(jù)保存在服務(wù)端(session)

    Session 技術(shù)

    Session:會(huì)話,從瀏覽器打開開始,直到瀏覽器關(guān)閉結(jié)束,無論在這個(gè)網(wǎng)站中訪問了多少頁(yè)面,點(diǎn)擊了多少鏈接,都屬于同一個(gè)會(huì)話。Session 也可以稱為會(huì)話 Cookie

    • 特點(diǎn):服務(wù)端技術(shù),將數(shù)據(jù)保存在服務(wù)器

    理解 Session

    前面已經(jīng)介紹了 Cookie 可以讓服務(wù)端程序跟蹤每個(gè)客戶端的訪問,但是每次客戶端的訪問都必須傳回這些 Cookie,如果 Cookie 很多,則無形增加了客戶端與服務(wù)端的數(shù)據(jù)傳輸量,而 Session 的出現(xiàn)正是為了解決這個(gè)問題。

    同一個(gè)客戶端每次和服務(wù)端交互時(shí),不需要每次都傳回所有的 Cookie 值,而是只要傳回一個(gè) ID,這個(gè) ID 就是客戶端第一次訪問服務(wù)器生成的,而且每個(gè)客戶端是唯一的。這樣每個(gè)客戶端就有了一個(gè)唯一的 ID,客戶端只要傳回這個(gè) ID 就行了,這個(gè) ID 通常是 NAME 為 JSESIONID 的一個(gè) Cookie。

    Session 基本操作

  • 獲取 Session 對(duì)象
    request對(duì)象.getSession()
    和參數(shù)為true的一樣
    request對(duì)象.getSession(true)
    獲取Session對(duì)象,如果沒有Session對(duì)象,直接創(chuàng)建一個(gè)新的返回,缺省值
    request對(duì)象.getSession(false)
    獲取Session對(duì)象,如果沒有返回null
  • 設(shè)置共享數(shù)據(jù)
  • Session對(duì)象.setAttribute(String name, Object value)
    • 注意:Session 可以存儲(chǔ)任何類型的數(shù)據(jù),比如登陸用戶的信息,可以封裝到User對(duì)象中
  • 修改共享數(shù)據(jù)
    重新設(shè)置一個(gè)同名的共享數(shù)據(jù)

  • 獲取共享數(shù)據(jù)
  • Object value = Session對(duì)象.getAttribute(String name);
  • 刪除 Session 中的共享數(shù)據(jù)
  • Session對(duì)象.removeAttribute(String name);
  • 銷毀 Session
  • void invalidate()
  • Session 的超時(shí)管理
    • 超時(shí):在訪問當(dāng)前的資源的過程中,不和網(wǎng)頁(yè)進(jìn)行任何的交互,超過設(shè)定的時(shí)間就是超時(shí)
      在 Tomcat 服務(wù)器中有默認(rèn)的配置為30分鐘,一般不需要去修改
    • 語(yǔ)法:void setMaxInactiveInterval(int interval)

    Session 擴(kuò)展

    • Seesion 中的共享數(shù)據(jù)的屬性名的命名規(guī)范:
      通常為:XXX_IN_SESSION,例如:Session對(duì)象.setAttribute(“USER_IN_SESSION”,user)
    • 序列化與反序列化:
      Session 中存儲(chǔ)的對(duì)象通常需要實(shí)現(xiàn)序列化接口,因?yàn)樵诰W(wǎng)絡(luò)之間傳輸?shù)臄?shù)據(jù)格式為二進(jìn)制數(shù)據(jù)
      • 序列化:將對(duì)象轉(zhuǎn)換成二進(jìn)制數(shù)據(jù)
      • 反序列化:將二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成對(duì)象
    • URL 重寫
      出現(xiàn)的問題:
      當(dāng)瀏覽器禁用Cookie之后,那么我們的jsessionid就不能在瀏覽器中保存,那么后面的請(qǐng)求中就不會(huì)將 jsessionid 發(fā)送到服務(wù)器,服務(wù)器這面就找不到數(shù)據(jù)
      解決方案:
      1.在url后手動(dòng)的拼接上 jsessionid
      傳遞格式如?/path/Servlet;jsessionid=sessionid
      2.使用響應(yīng)對(duì)象中的encodeURL(String path)實(shí)現(xiàn) jsessionid 的自動(dòng)拼接
      String path = resp.encodeURL("path/Servlet");
      • 推薦方式:②

    歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明出處!
    簡(jiǎn)書ID:@我沒有三顆心臟
    github:wmyskxz

    總結(jié)

    以上是生活随笔為你收集整理的初学Java Web(5)——cookie-session学习的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。