cookie與session

1,基本概念

cookie機(jī)制采用的是在客戶端保持狀態(tài)的方案,當(dāng)你在瀏覽網(wǎng)站的時(shí)候,cookie是一個(gè)文本信息,會(huì)幫你在網(wǎng)站上所打的文字或是一些選擇,都紀(jì)錄下來。當(dāng)下次你再瀏覽同一個(gè)網(wǎng)站,首先會(huì)查一下有沒有上次留下的資料,有的話,就會(huì)依據(jù) Cookie里的內(nèi)容來判斷使用者,送出特定的網(wǎng)頁內(nèi)容給你。

cookie機(jī)制正統(tǒng)的cookie分發(fā)是通過擴(kuò)展HTTP協(xié)議來實(shí)現(xiàn)的,服務(wù)器通過在HTTP的響應(yīng)頭中加上一行特殊的指示以提示瀏覽器按照指示生成相應(yīng)的cookie。然而純粹的客戶端腳本JavaScript或者VBScript也可以生成cookie。而cookie的使用是由瀏覽器按照一定的原則在后臺(tái)自動(dòng)發(fā)送給服務(wù)器的。瀏覽器檢查所有存儲(chǔ)的cookie,如果某個(gè)cookie所聲明的作用范圍大于等于將要請(qǐng)求的資源所在的位置,則把該cookie附在請(qǐng)求資源的HTTP請(qǐng)求頭上發(fā)送給服務(wù)器。cookie的內(nèi)容主要包括:名字,值,過期時(shí)間,路徑和域。路徑與域一起構(gòu)成cookie的作用范圍。若不設(shè)置過期時(shí)間,則表示這個(gè)cookie的生命期為瀏覽器會(huì)話期間,關(guān)閉瀏覽器窗口,cookie就消失。這種生命期為瀏覽器會(huì)話期的cookie被稱為會(huì)話cookie。會(huì)話cookie一般不存儲(chǔ)在硬盤上而是保存在內(nèi)存里,當(dāng)然這種行為并不是規(guī)范規(guī)定的。若設(shè)置了過期時(shí)間,瀏覽器就會(huì)把cookie保存到硬盤上,關(guān)閉后再次打開瀏覽器,這些cookie仍然有效直到超過設(shè)定的過期時(shí)間。存儲(chǔ)在硬盤上的cookie可以在不同的瀏覽器進(jìn)程間共享,比如兩個(gè)IE窗口。而對(duì)于保存在內(nèi)存里的cookie,不同的瀏覽器有不同的處理方式 .Cookie實(shí)際上是一小段的文本信息。Java初高級(jí)一起學(xué)習(xí)分享,共同學(xué)習(xí)才是最明智的選擇,喜歡的話可以我的學(xué)習(xí)群64弍46衣3凌9,或加資料群69似64陸0吧3.客戶端請(qǐng)求服務(wù)器,如果服務(wù)器需要記錄該用戶狀態(tài),就使用response向客戶端瀏覽器頒發(fā)一個(gè)Cookie。MaxAge決定cookie的有效期,如果它是整數(shù),在整數(shù)秒后失效,但是瀏覽器會(huì)將maxAge為正數(shù)的使他持久化,然后存儲(chǔ)在對(duì)應(yīng)的cookie文件中。刪除cookie設(shè)置maxAge為0就行。同名的cookie,其他也相同的化會(huì) 覆蓋原來的cookie,如果只有名字一樣,其他不一樣,是不同的cookie。

Session是在服務(wù)器上建立客戶的相關(guān)信息,訪問服務(wù)器時(shí),在session中查詢客戶的這些信息。實(shí)現(xiàn)登陸可以這樣做:HttpSession session = request.getSession(); // 獲取Session對(duì)象session.setAttribute("loginTime", new Date()); // 設(shè)置Session中的屬性out.println("登錄時(shí)間為:" +(Date)session.getAttribute("loginTime")); // 獲取Session屬性只有在訪問jsp或者Servlet等程序時(shí)才會(huì)創(chuàng)建session,session會(huì)設(shè)置超時(shí)時(shí)間,過了這個(gè)時(shí)間沒有訪問session他就會(huì)失效。

session機(jī)制,session機(jī)制是一種服務(wù)器端的機(jī)制,服務(wù)器使用一種類似于散列表的結(jié)構(gòu)(也可能就是使用散列表)來保存信息。 當(dāng)程序需要為某個(gè)客戶端的請(qǐng)求創(chuàng)建一個(gè)session時(shí),服務(wù)器首先檢查這個(gè)客戶端的請(qǐng)求里是否已包含了一個(gè)session標(biāo)識(shí)(稱為session id),如果已包含則說明以前已經(jīng)為此客戶端創(chuàng)建session,服務(wù)器就按照session id把這個(gè)session檢索出來使用(檢索不到,會(huì)新建一個(gè)),如果客戶端請(qǐng)求不包含session id,則為此客戶端創(chuàng)建一個(gè)session并且生成一個(gè)與此session相關(guān)聯(lián)的session id,session id的值應(yīng)該是一個(gè)既不會(huì)重復(fù),又不容易被找到規(guī)律以仿造的字符串,這個(gè)session id將被在本次響應(yīng)中返回給客戶端保存。保存這個(gè)session id的方式可以采用cookie,這樣在交互過程中瀏覽器可以自動(dòng)的按照規(guī)則把這個(gè)標(biāo)識(shí)發(fā)送給服務(wù)器。一般這個(gè)cookie的名字都是類似于SEEESIONID。但cookie可以被人為的禁止,則必須有其他機(jī)制以便在cookie被禁止時(shí)仍然能夠把session id傳遞回服務(wù)器。 經(jīng)常被使用的一種技術(shù)叫做URL重寫,就是把session id直接附加在URL路徑的后面。還有一種技術(shù)叫做表單隱藏字段。就是服務(wù)器會(huì)自動(dòng)修改表單,添加一個(gè)隱藏字段,以便在表單提交時(shí)能夠把session id傳遞回服務(wù)器.

cookie 和session 的區(qū)別:1、cookie數(shù)據(jù)存放在客戶的瀏覽器上,session數(shù)據(jù)放在服務(wù)器上。2、cookie不是很安全,別人可以分析存放在本地的COOKIE并進(jìn)行COOKIE欺騙考慮到安全應(yīng)當(dāng)使用session。3、session會(huì)在一定時(shí)間內(nèi)保存在服務(wù)器上。當(dāng)訪問增多,會(huì)比較占用你服務(wù)器的性能考慮到減輕服務(wù)器性能方面,應(yīng)當(dāng)使用COOKIE。4、單個(gè)cookie保存的數(shù)據(jù)不能超過4K,很多瀏覽器都限制一個(gè)站點(diǎn)最多保存20個(gè)cookie。5、 將登陸信息等重要信息存放為SESSION 其他信息如果需要保留,可以放在COOKIE中轉(zhuǎn)博客https://www.cnblogs.com/shiyangxt/articles/1305506.htmlhttps://blog.csdn.net/fangaoxin/article/details/6952954Cookies

與Session的應(yīng)用場(chǎng)景:登陸驗(yàn)證信息。一般采用Session("Logon")=true or false的形式。用戶的各種私人信息,比如姓名等,某種情況下,需要保存在Session里需要在頁面間傳遞的內(nèi)容信息,比如調(diào)查工作需要分好幾步。每一步的信息都保存在Session里,最后在統(tǒng)一更新到數(shù)據(jù)庫。

cookie最典型的應(yīng)用是: (一):判斷用戶是否登陸過網(wǎng)站,以便下次登錄時(shí)能夠直接登錄。如果我們刪除cookie,則每次登錄必須從新填寫登錄的相關(guān)信息。(二):另一個(gè)重要的應(yīng)用是“購物車”中類的處理和設(shè)計(jì)。用戶可能在一段時(shí)間內(nèi)在同一家網(wǎng)站的不同頁面選擇不同的商品,可以將這些信息都寫入cookie,在最后付款時(shí)從cookie中提取這些信息,當(dāng)然這里面有了安全和性能問題需要我們考慮了。

登錄頁面:login.jsp <%--本頁面提供登錄表單,還要顯示錯(cuò)誤信息 --%>

登錄

<%? ? String uname ="";? ? Cookie[] cs = request.getCookies();? ? if(cs!=null){? ? ? for(Cookie c:cs){? ? ? if("uname".equals(c.getName()))? ? ? {? ? ? ? uname=c.getValue();? ? ? }? ? ? }? ? }? ? %>? ? <%? ? String message="";? ? String msg = (String)request.getAttribute("msg");? ? if(msg!=null){? ? ? message = msg;? ? }? ? %><%=message %>

用戶名:

密 碼:

4,自己寫:servlet處理頁面

LoginServlet.java public void doPost(HttpServletRequest request, HttpServletResponse response)? throws ServletException, IOException

{? //獲取表單數(shù)據(jù)? //處理編碼問題?

request.setCharacterEncoding("UTF-8");?

String username = request.getParameter("username");?

String password = request.getParameter("password");? //校驗(yàn)用戶名和密碼是否正確?

if(!"itcast".equalsIgnoreCase(username))

{//登陸成功? ? ? Cookie cookie = new Cookie("uname",username);//獲取cookie?

? cookie.setMaxAge(60*60*24);? response.addCookie(cookie);? ? ?

HttpSession session = request.getSession();//獲取session?

?session.setAttribute("username", username);//向session域中存username? response.sendRedirect("/hellosession1/session2/succ1.jsp");? }

else{//登錄失敗? //如果失敗,保存到request域中,轉(zhuǎn)發(fā)到login.jsp? request.setAttribute("msg", "用戶名或密碼錯(cuò)誤");? request.getRequestDispatcher("/session2/login.jsp").forward(request, response);? }? }?

登錄成功頁面:succ1.jsp? ? <%? ? ? String username = (String)session.getAttribute("username");? ? ? if(username==null){? ? ? request.setAttribute("msg", "您還沒有登錄,請(qǐng)先登錄!");? ? ? request.getRequestDispatcher("/session2/login.jsp").forward(request, response);? ? ? return;? ? ? }? ? %>

登錄成功

歡迎回來<%=session.getAttribute("username") %>? ? 自己的代碼:1,session(1)Index頁面<% response.sendRedirect("/index.do"); %> 寫在body中(2)跳轉(zhuǎn) (3)登陸頁代碼<%@ page language="java" contentType="text/html; charset=UTF-8"? ? pageEncoding="UTF-8"%>

4,登陸成功后代碼<%@ page language="java" contentType="text/html; charset=UTF-8"? ? pageEncoding="UTF-8"%>

${sessionScope.user.name }登錄成功!!!

歡迎您,${sessionScope.name }

5,后臺(tái)代碼

package com.cust.CS.controller;

import org.springframework.stereotype.Controller;

import org.springframework.ui.ModelMap;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.SessionAttributes;

import com.cust.CS.pojo.Cs;

@Controller("/console")

@SessionAttributes({"user","name"})

public class Login

?{@RequestMapping("/login.do")

public String Login_l(Cs user,ModelMap map)

{//user會(huì)自己注入session中//將name放入session作用域中,這樣轉(zhuǎn)發(fā)頁面也可以取到這個(gè)數(shù)據(jù)。

map.addAttribute("name", user.getName());return "/loginSuccess";}}?

Cookie<%@ page language="java" contentType="text/html; charset=UTF-8"? ? pageEncoding="UTF-8"%>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 目錄Cookie機(jī)制什么是CookieCookie的不可跨域名性Unicode編碼:保存中文BASE64編碼:保存...
    Tomatoro閱讀 17,044評(píng)論 7 186
  • 會(huì)話(Session)跟蹤是Web程序中常用的技術(shù),用來跟蹤用戶的整個(gè)會(huì)話。常用的會(huì)話跟蹤技術(shù)是Cookie與Se...
    chinariver閱讀 5,786評(píng)論 1 49
  • 暖暖的風(fēng),淡淡的云,清晨落下的雨也不知所蹤,微藍(lán)的天,繾綣著五月的陽光,花依舊在星城各個(gè)角落開放著,綠蔭斑駁了...
    那些年聆聽的閱讀 121評(píng)論 0 0
  • 馬上就要結(jié)束,意味著該分散了,最后這幾天求關(guān)注的心理還是蠻強(qiáng)的,因?yàn)閷?duì)之后的工作有點(diǎn)迷茫,不知道該做預(yù)售還...
    是軍兒呀閱讀 447評(píng)論 0 3
  • 如若不關(guān)心實(shí)現(xiàn)細(xì)節(jié)可直接查看“ObjectBox 架構(gòu)”、“總結(jié)”這兩部分內(nèi)容。(簡(jiǎn)書不支持錨點(diǎn)(;′⌒`)) 一...
    Cavabiao閱讀 2,152評(píng)論 1 9

友情鏈接更多精彩內(nèi)容