你想了解的Cookie和Session就在这~
目錄
- 1、會(huì)話的概念
- 2、保存會(huì)話的兩種技術(shù)
- 3、Cookie
- 4、Session(重點(diǎn))
1、會(huì)話的概念
我們知道session的意思就是會(huì)話,Cookie和Session 是兩種會(huì)話技術(shù),我們首先了解一下會(huì)話的概念
會(huì)話:用戶打開(kāi)一個(gè)瀏覽器,點(diǎn)擊了很多超鏈接,訪問(wèn)多個(gè)web資源,關(guān)閉瀏覽器,這個(gè)過(guò)程可以稱之為會(huì)話
有狀態(tài)會(huì)話:比如你訪問(wèn)一個(gè)網(wǎng)站,下次再次訪問(wèn)時(shí),這個(gè)網(wǎng)站會(huì)知道你曾經(jīng)訪問(wèn)過(guò),這就是有狀態(tài)會(huì)話
-
有狀態(tài)會(huì)話建立在客戶端和服務(wù)端
-
服務(wù)端給客戶端一個(gè)信件,客戶端下次訪問(wèn)服務(wù)端帶上信件就可以讓服務(wù)端知道你來(lái)過(guò),這就是cookie
-
服務(wù)器登記你來(lái)過(guò)了,下次你來(lái)的時(shí)候?qū)δ氵M(jìn)行匹配,這就是seesion
2、保存會(huì)話的兩種技術(shù)
cookie
- 客戶端技術(shù)(服務(wù)端通過(guò)響應(yīng)發(fā)給客戶端,客戶端通過(guò)請(qǐng)求帶到服務(wù)器上)
session
-
服務(wù)器技術(shù),利用這個(gè)技術(shù)可以保存用戶的會(huì)話信息,我們可以把信息或者數(shù)據(jù)放在session中
常見(jiàn)場(chǎng)景:網(wǎng)站登錄之后,下次就不用再登陸了,第二次直接就登陸了
3、Cookie
流程:
- 客戶端向服務(wù)端發(fā)出請(qǐng)求,服務(wù)端從請(qǐng)求中拿到cookie信息
- 服務(wù)器響應(yīng)給客戶端相應(yīng)的cookie
這樣下次登錄的時(shí)候,客戶端帶著上次的cookie向服務(wù)端發(fā)出請(qǐng)求,服務(wù)端根據(jù)cookie響應(yīng)出對(duì)應(yīng)的cookie給客戶端,這樣客戶端每次請(qǐng)求都有上次的cookie,就實(shí)現(xiàn)了"服務(wù)端知道你曾經(jīng)訪問(wèn)"
常用方法:
Cookie[] cookies = req.getCookies();//獲得Cookie,這里返回?cái)?shù)組,說(shuō)明Cookie可能存在多個(gè)
cookie.getName();//獲得cookie中的key
cookie.getValue();//獲得cookie中的value
new Cookie("LastLoginTime", System.currentTimeMillis() + "");//新建一個(gè)Cookie
cookie.setMaxAge(24 * 60 * 60);//設(shè)置Cookie的有效期(以s為單位)
resp.addCookie(cookie);//響應(yīng)給客戶端一個(gè)cookie
細(xì)節(jié)問(wèn)題:
- 一個(gè)Cookie只能保存一個(gè)信息
- 一個(gè)web站點(diǎn)可以給瀏覽器發(fā)送多個(gè)cookie
- Cookie大小有限制
怎么刪除Cookie?
- 不設(shè)置有效期,關(guān)閉瀏覽器,自動(dòng)失效;
- 設(shè)置有效期時(shí)間為0;
示例cookie01,用來(lái)保存用戶上一次訪問(wèn)的時(shí)間:
//保存用戶上一次訪問(wèn)的時(shí)間
public class Cookie01 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//解決中文亂碼req.setCharacterEncoding("utf-8");resp.setCharacterEncoding("utf-8");//獲取輸出流PrintWriter out = resp.getWriter();//cookie,服務(wù)器端從客戶端獲取Cookie[] cookies = req.getCookies();//這里返回?cái)?shù)組,說(shuō)明Cookie可能存在多個(gè)//判斷Cookie是否存在if (cookies != null) {//如果存在out.write("你上一次訪問(wèn)的時(shí)間是:");for (Cookie cookie : cookies) {if (cookie.getName().equals("LastLoginTime")) {//獲取cookie的值Date date = new Date(Long.parseLong(cookie.getValue()));out.write(date.toLocaleString());}}} elseout.write("這是你第一次訪問(wèn)");//服務(wù)器給客戶端相應(yīng)一個(gè)cookieCookie cookie = new Cookie("LastLoginTime", System.currentTimeMillis() + "");//設(shè)置cookie的有效期為一天,以秒為單位cookie.setMaxAge(24 * 60 * 60);//服務(wù)器將cookie響應(yīng)給客戶端resp.addCookie(cookie);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
添加對(duì)應(yīng)的注冊(cè)和請(qǐng)求路徑
<servlet><servlet-name>cookie01</servlet-name><servlet-class>com.zsr.servlet.Cookie01</servlet-class>
</servlet>
<servlet-mapping><servlet-name>cookie01</servlet-name><url-pattern>/c1</url-pattern>
</servlet-mapping>
**測(cè)試:**我們打開(kāi)瀏覽器,輸入 http://localhost:8080/c1 ,就可以看到上次訪問(wèn)的時(shí)間,刷新,同樣可以看到上次的訪問(wèn)時(shí)間
接著,我們打開(kāi)檢查看響應(yīng)標(biāo)頭,也可以看到對(duì)應(yīng)設(shè)置的信息
對(duì)于亂碼問(wèn)題的處理(encode和decode):
-
URLDecoder.decode(cookie.getValue() //節(jié)碼 URLEncoder.encode("鐘嗣儒", "utf-8") //編碼 -
測(cè)試樣例(輸入中文測(cè)試)
//保存用戶上一次名字
public class Cookie02 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//解決中文亂碼req.setCharacterEncoding("utf-8");resp.setCharacterEncoding("utf-8");//獲取輸出流PrintWriter out = resp.getWriter();//cookie,服務(wù)器端從客戶端獲取Cookie[] cookies = req.getCookies();//這里返回?cái)?shù)組,說(shuō)明Cookie可能存在多個(gè)//判斷Cookie是否存在if (cookies != null) {//如果存在out.write("你上一次訪問(wèn)名字是:");for (Cookie cookie : cookies) {if (cookie.getName().equals("name")) {//獲取cookie的值out.write(URLDecoder.decode(cookie.getValue(), "utf-8"));}}} elseout.write("這是你第一次訪問(wèn)");//服務(wù)器給客戶端相應(yīng)一個(gè)cookieCookie cookie = new Cookie("name", URLEncoder.encode("鐘嗣儒", "utf-8"));//設(shè)置cookie的有效期為一天,以秒為單位cookie.setMaxAge(24 * 60 * 60);resp.addCookie(cookie);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
4、Session(重點(diǎn))
關(guān)于Session:
- 服務(wù)器會(huì)給每一個(gè)用戶(每一個(gè)瀏覽器)創(chuàng)建一個(gè)Session對(duì)象;
- 一個(gè)Session獨(dú)占一個(gè)瀏覽器,只要瀏覽器沒(méi)有關(guān)閉,這個(gè)Session就存在;
- 示例:用戶登錄之后,整個(gè)網(wǎng)站的其他分支他都可以訪問(wèn)(比如登陸了B站,Session保存用戶的所有信息,用戶的個(gè)人中心,投稿頁(yè)面等都可以訪問(wèn),但如果沒(méi)有登錄,則不能訪問(wèn))
Session和Cookie的區(qū)別:
- Cookie是把用戶的數(shù)據(jù)寫(xiě)給用到的瀏覽器,瀏覽器保存(可以保存多個(gè))
- Session是把用戶的數(shù)據(jù)寫(xiě)到用戶獨(dú)占的Session中,服務(wù)器端保存(保存重要信息,減少服務(wù)器資源浪費(fèi))
- Session由服務(wù)器創(chuàng)建
使用場(chǎng)景:
- 保存一個(gè)用戶的登錄信息;
- 購(gòu)物車信息;
- 整個(gè)網(wǎng)站中經(jīng)常會(huì)使用的數(shù)據(jù),我們把它保存在Session中
Session的常用方法:
案例代碼示例:
- Session01(用來(lái)向session中存東西)
public class Session01 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//解決亂碼問(wèn)題resp.setCharacterEncoding("utf-8");req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf8");//得到SessionHttpSession session = req.getSession();//給Session中存東西session.setAttribute("name", "zsr");//存字符串session.setAttribute("person", new Person("gcc", "2018217876"));//存對(duì)象//獲取Session的IDString id = session.getId();//判斷Session是不是新創(chuàng)建的if (session.isNew())resp.getWriter().write("session創(chuàng)建成功,ID為:" + id);elseresp.getWriter().write("session已經(jīng)在服務(wù)器中存在,ID為:" + id);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
- Session02(用來(lái)得到session里的東西并輸出顯示)
public class Session02 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//解決亂碼問(wèn)題resp.setCharacterEncoding("utf-8");req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf8");//得到SessionHttpSession session = req.getSession();//獲取Object name = session.getAttribute("name");//獲取字符串Object p = session.getAttribute("person");//獲取對(duì)象System.out.println((String) name);System.out.println(p);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);}
}
- Session03(用來(lái)注銷session)
//注銷
public class Session03 extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//解決亂碼問(wèn)題resp.setCharacterEncoding("utf-8");req.setCharacterEncoding("utf-8");resp.setContentType("text/html;charset=utf8");//得到SessionHttpSession session = req.getSession();//取消掉namesession.removeAttribute("name");//手動(dòng)注銷sessionsession.invalidate();}
- web.xml配置
<!-- Cookie01--><servlet><servlet-name>cookie01</servlet-name><servlet-class>com.zsr.servlet.Cookie01</servlet-class></servlet><servlet-mapping><servlet-name>cookie01</servlet-name><url-pattern>/c1</url-pattern></servlet-mapping><!-- Cookie02--><servlet><servlet-name>cookie02</servlet-name><servlet-class>com.zsr.servlet.Cookie02</servlet-class></servlet><servlet-mapping><servlet-name>cookie02</servlet-name><url-pattern>/c2</url-pattern></servlet-mapping><!-- Session01--><servlet><servlet-name>session01</servlet-name><servlet-class>com.zsr.servlet.Session01</servlet-class></servlet><servlet-mapping><servlet-name>session01</servlet-name><url-pattern>/s1</url-pattern></servlet-mapping><!-- Session02--><servlet><servlet-name>session02</servlet-name><servlet-class>com.zsr.servlet.Session02</servlet-class></servlet><servlet-mapping><servlet-name>session02</servlet-name><url-pattern>/s2</url-pattern></servlet-mapping><!-- Session03--><servlet><servlet-name>session03</servlet-name><servlet-class>com.zsr.servlet.Session03</servlet-class></servlet><servlet-mapping><servlet-name>session03</servlet-name><url-pattern>/s3</url-pattern></servlet-mapping><!-- 設(shè)置Session默認(rèn)的失效時(shí)間--><session-config><!--15分鐘后,session自動(dòng)失效,以分鐘為單位--><session-timeout>15</session-timeout></session-config>
測(cè)試1:
首先訪問(wèn)localhost:8080/s1
我們打開(kāi)檢查,可以發(fā)現(xiàn)我們的session的ID(JSESSIONID)在cookie里面
這是問(wèn)什么呢??Session創(chuàng)建的時(shí)候做了什么事情??根據(jù)上述結(jié)果,我們可以總結(jié)做了以下事情
Cookie cookie = new Cookie("JSESSIONID", id);
resp.addCookie(cookie);
測(cè)試二:
我們首先走localhost:8080/s1
再走localhost:8080/s2,可以看到控制臺(tái)輸出了對(duì)應(yīng)的信息
然后我們?cè)僮遧ocalhost:8080/s3,注銷了session,再走localhost:8080/s2,可以看到控制臺(tái)輸出null,證明注銷了
然后我們?cè)僮遧ocalhost:8080/s1,可以看到新生成了一個(gè)ID,與前面的ID不同,這說(shuō)明:
session注銷后會(huì)立馬生成一個(gè)新的session
其中,關(guān)于Session注銷有兩種方式:
-
手動(dòng)注銷:
session.invalidate(); -
自動(dòng)注銷:(在web.xml中配置,單位為分鐘)
<!-- 設(shè)置Session默認(rèn)的失效時(shí)間--> <session-config><!--15分鐘后,session自動(dòng)失效,以分鐘為單位--><session-timeout>15</session-timeout> </session-config>
總結(jié)
以上是生活随笔為你收集整理的你想了解的Cookie和Session就在这~的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 来谈谈Servlet~~
- 下一篇: 8086汇编语言精华笔记总结~