第五天:會話技術 cookie session
什麼叫會話?
會話:當使用者打開浏覽器到關閉浏覽器之間所做的一系列請求稱之為一次會話。
會話技術:在一次會話的多次請求之間共享資料
因為http協定是無狀态的(不能共享資料,每次請求獨立的)
會話技術有兩種:cookie和session
cookie:
特點:資料會儲存在浏覽器中
在響應頭 set-cookie:code=swlz
請求頭會有cookie:code=swlz
例子:
package com.swlz.cookie;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/servletCookieDemo1")
public class ServletCookieDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String code="swlz";
//建立cookie對象,設定初始化值 code 以鍵值對的形式
Cookie cookie = new Cookie("code", code);
response.addCookie(cookie);//響應cookie,添加cookie
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
package com.swlz.cookie;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/servletCookieDemo")
public class ServletCookieDemo extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie[] cookies = request.getCookies();//擷取cookie
if(cookies!=null&&cookies.length>0){
for (int i = 0; i < cookies.length; i++) {
String name = cookies[i].getName();
String value = cookies[i].getValue();
response.getWriter().println(name+":"+value);
}
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
細節:設定cookie有效路徑 唯一确定cookie就需要通過path和name
例子如下:
package com.swlz.cookie;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/servletCookieDemo2")
public class ServletCookieDemo2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String code="swlz-path";
Cookie cookie = new Cookie("code", code);
//設定cookie有效路徑 有效路徑是什麼意思?
// 以後隻有浏覽器通路這個路徑的資源才會攜帶cookie(隻有通路帶有/user的通路路徑才會攜帶cookie,其他的不會攜帶)
//如果你不設定就是/
cookie.setPath("/user");
response.addCookie(cookie);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
cookie的類别
a) 持久級别的cookie
我們可以通過setMaxAge方法設定cookie的有效時間,隻有設定的參數大于0,這個cookie就變成了持久級别的cookie了
删除持久級别的cookie可以設定cookie的有效時間為0
b) 會話級别的cookie
- Cookie儲存在浏覽器記憶體中,浏覽器關閉,cookie消失(一次會話範圍内有效)
session:
特點:資料會儲存在伺服器中
session的實作基于cookie
Jsessionid存儲在cookie中
package com.swlz.session;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/servletSessionDemo1")
public class ServletSessionDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
String code = (String) session.getAttribute("code");
// System.out.println(code);
response.getWriter().println(code);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
package com.swlz.session;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/servletSessionDemo")
public class ServletSessionDemo extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String code="6666";
HttpSession session = request.getSession();
session.setAttribute("code",code);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
Session細節:
- 浏覽器關閉之後,Session并不會立馬銷毀,session銷毀的預設時間為30分鐘
- Session可以作為域對象存儲資料
- 作用範圍:
一次會話
Request 一次請求
Session 一次會話的多次請求之間
ServeltContext 整個web項目
- Session的生命周期
建立:浏覽器第一次調用request的getSession方法的時候建立Session
銷毀:
- 30分鐘有效時間到期,web.xml
- 手動調用了session的session.invalidate();
- 伺服器非正常關閉的時候Session會銷毀,正常關閉伺服器Session會被鈍化(序列化)到磁盤,下一次重新啟動tomcat的時候session又會被銳化(反序列化)到記憶體中
注意:
在idea中,每次釋出項目都會建立tomcat的臨時配置,每次重新開機tomcat,配置檔案都會重新生成(之前的會被删除)
使用者發送請求到伺服器處理的流程(個人了解):

http(超文本傳輸協定)
特點:1.基于tcp/ip模型
2.基于請求和響應模型有一次請求就會有一次響應
3.安全
4.無狀态
請求流程(個人了解):
使用者第一次在浏覽器發送請求,伺服器(tomcat)會幫你從伺服器中找到你請求的資源對應的servlet,幫你把你請求的資料封裝起來,建立request對象,然後建立response對象,封裝好response的資料(響應行,響應頭,響應體),傳回到浏覽器,請求的資料會響應到頁面,展示給使用者。
tomcat幫你建立request對象和
幫你封裝好request
Cookie 和 Session差別:
- cookie的資料是保持在浏覽器中的,Session的資料是儲存在伺服器中的
- cookie相對不安全,session安全
- cookie隻能儲存少量的資料到浏覽器(對每個cookie的大小有限制,并且對每個項目的cookie資料也有限制),Session對儲存的資料量和個數沒有限制
今日學習感受:javaweb的多學重在多了解,知道原理和意思,知道使用者從用戶端發送請求到浏覽器的流程是一個什麼情況。最後一句話:勤學多思。