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