會話技術
- 1. 會話技術
- 2. Cookie
-
- 2.1 概念:
- 2.2 快速入門使用
- 2.3 實作原理
- 2.4 cookie的細節
-
- 2.4.1 一次可不可以發送多個cookie?
- 2.4.2 cookie在浏覽器中儲存多長時間?
- 2.4.3 cookie能不能存中文?
- 2.4.4 cookie共享問題?
- 2.5 Cookie的特點和作用
- 2.6 案例:記住上一次通路時間
- 3. Session
-
- 3.1 概念:
- 3.2 方法
- 3.3 原理
- 3.4 Session生存時間
- 3.4 session的特點
- 4. session與Cookie的差別:
1. 會話技術
-
會話:一次會話中包含多次請求和響應。
一次會話:浏覽器第一次給伺服器資源發送請求,會話建立,直到有一方斷開為止
- 功能:在一次會話的範圍内的多次請求間,共享資料
- 方式:
- 用戶端會話技術:Cookie
- 伺服器端會話技術:Session
2. Cookie
2.1 概念:
用戶端會話技術,将資料儲存到用戶端
2.2 快速入門使用
步驟:
-
建立Cookie對象,綁定資料
new Cookie(String name, String value)
-
發送Cookie對象,通過響應頭set-cookie
response.addCookie(Cookie cookie)
-
擷取Cookie,拿到資料
Cookie[] request.getCookies()
public class CookieServlet2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//建立Cookie
Cookie cookie = new Cookie("username","huangchenglong");
//伺服器把Cookie送給用戶端,通過響應頭set-cookie
response.addCookie(cookie);//response幫你設定響應頭了 set-cookie
//擷取從用戶端發送過來的cookie
Cookie[] cookies = request.getCookies();
for(Cookie cookie:cookies){
String name = cookie.getName();
String value = cookie.getValue();
System.out.println(name+":"+value);
}
}
}
2.3 實作原理
- 基于響應頭set-cookie和請求頭cookie實作
- 伺服器通過響應頭set-cookie把cookie響應到用戶端,
- 用戶端每次請求的時候都會通過請求頭cookie傳遞這個cookie
2.4 cookie的細節
2.4.1 一次可不可以發送多個cookie?
- 可以
- 可以建立多個Cookie對象,使用response調用多次addCookie方法發送cookie即可。
@WebServlet("/cookieServlet")
public class CookieServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
//會話跟蹤技術
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//建立Cookie
Cookie cookie = new Cookie("username","huangchenglong");
Cookie cookie2 = new Cookie("password","1314520");//name一樣的話就是覆寫
Cookie cookie3 = new Cookie("age","18");
//伺服器把Cookie送給用戶端
response.addCookie(cookie);//response幫你設定響應頭了 set-cookie
response.addCookie(cookie2);
response.addCookie(cookie3);
}
}
2.4.2 cookie在浏覽器中儲存多長時間?
- 預設情況下,當浏覽器關閉後,Cookie資料被銷毀
- 持久化存儲:
-
setMaxAge(int seconds)
1. 正數: 将Cookie資料寫到硬碟的檔案中。持久化存儲。并指定cookie存活時間(機關:秒),時間到後,cookie檔案自動失效
2. 負數: 預設值,當浏覽器關閉後,Cookie資料被銷毀
3. 零: 删除已有cookie資訊(例如:其他Servlet添加的cookie資訊)
-
Cookie cookie = new Cookie("username","huangchenglong");
Cookie cookie2 = new Cookie("password","1314520");//name一樣的話就是覆寫
//浏覽器要不要緩存cookie是根據cookie的設定來的
cookie.setMaxAge(-1);//負整數,就是預設值,就是浏覽器關閉cookie就消失 通常都是用-1
cookie2.setMaxAge(60);//在浏覽器記憶體中存活60秒中
//伺服器把Cookie送給用戶端
response.addCookie(cookie);//response幫你設定響應頭了 set-cookie
response.addCookie(cookie2);
//删除usernamecookie
//建立一個名字一樣的cookie
Cookie cookie = new Cookie("username","huangchenglong");
cookie.setMaxAge(0);//把用戶端浏覽器的cookie幹掉
response.addCookie(cookie);
2.4.3 cookie能不能存中文?
- 在tomcat 8 之前,cookie中不能直接存儲中文資料。
- 需要将中文資料轉碼—一般采用URL編碼(%E3)
-
在tomcat 8 之後,cookie支援中文資料。特殊字元還是不支援,建議使用URL編碼存儲,URL解碼解析
URL編碼存儲 (URLEncoder.encode(string name,string enc))
url編碼之後的效果
使用者名:%E7%94%A8%E6%88%B7%E5%90%8D
黃成龍:%E9%BB%84%E6%88%90%E9%BE%99
URL解碼解析(URLDecoder.decode(string name,string enc))protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //cookie中存中文的問題 // Cookie cookie = new Cookie("使用者名","黃成龍"); //cookie如果出現了不能存中文的問題,怎麼解決 String name = "使用者名"; String value = "黃成龍"; //采用url編碼 name = URLEncoder.encode(name,"utf-8"); value = URLEncoder.encode(value,"utf-8"); System.out.println(name); System.out.println(value); Cookie cookie = new Cookie(name,value); response.addCookie(cookie); }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // url編碼之後的效果 // %E7%94%A8%E6%88%B7%E5%90%8D:%E9%BB%84%E6%88%90%E9%BE%99 //擷取從用戶端發送過來的cookie Cookie[] cookies = request.getCookies(); for(Cookie cookie:cookies){ String name = cookie.getName(); String value = cookie.getValue(); //url解碼 name = URLDecoder.decode(name,"utf-8"); value = URLDecoder.decode(value,"utf-8"); System.out.println(name+":"+value); } }
2.4.4 cookie共享問題?
- 假設在一個tomcat伺服器中,部署了多個web項目,那麼在這些web項目中cookie能不能共享?
- 預設情況下cookie不能共享
-
setPath(String path):設定cookie的擷取範圍。預設情況下,設定目前的虛拟目錄
如果要共享,則可以将path設定為"/" , “/” 為項目根目錄http://localhost:8080/項目名
Cookie cookie = new Cookie(name,value); //如果想讓這個cookie在相同tomcat中不同項目裡都可以擷取到的話 //隻需要設定下cookie的path就可以了 / cookie.setPath("/"); response.addCookie(cookie);
-
不同的tomcat伺服器間 cookie共享問題?
百度的項目多不多?很多,百度新聞,百度搜尋,百度地圖。。。。
- setDomain(String path):如果設定一級域名相同,那麼多個伺服器之間cookie可以共享
- setDomain(".baidu.com"),那麼tieba.baidu.com和news.baidu.com中cookie可以共享
www.baidu.com ,new.baidu.com, map.baidu.com
一級域名:.baidu.com
二級域名:www,new,map
Cookie.setDomain(“.baidu.com”)
2.5 Cookie的特點和作用
- cookie存儲資料在用戶端浏覽器
- 浏覽器對于單個cookie 的大小有限制(4kb) 以及 對同一個域名下的總cookie數量也有限制(20個)
作用:
- cookie一般用于存出少量的不太敏感的資料(應用在用戶端的設定資訊)
- 在不登入的情況下,完成伺服器對用戶端的身份識别
2.6 案例:記住上一次通路時間
1.需求:
- 通路一個Servlet,如果是第一次通路,則提示:您好,歡迎您首次通路。
- 如果不是第一次通路,則提示:歡迎回來,您上次通路時間為:顯示時間字元串
2.分析:
- 可以采用Cookie來完成
- 在伺服器中的Servlet判斷是否有一個名為lastTime的cookie
-
有:不是第一次通路
1. 響應資料:歡迎回來,您上次通路時間為:2018年6月10日11:50:20
2. 寫回Cookie:lastTime=2018年6月10日11:50:01
-
沒有:是第一次通路
1. 響應資料:您好,歡迎您首次通路
2. 寫回Cookie:lastTime=2018年6月10日11:50:01
-
- 代碼實作:
@WebServlet("/lastTimeServlet")
public class LastTimeServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setCharacterEncoding("gbk");
Cookie[] cookies = request.getCookies();
boolean flag = false;
if(cookies!=null && cookies.length>0){
for(Cookie cookie:cookies){
String name = cookie.getName();
if("lastTime".equals(name)){
flag=true;
//取出時間
String value = cookie.getValue();
value = URLDecoder.decode(value,"utf-8");
//設定新的時間
String newTime = new Date().toLocaleString();
newTime = newTime.replace(" ","");
newTime = URLEncoder.encode(newTime,"utf-8");
cookie.setValue(newTime);
response.addCookie(cookie);
response.getWriter().write("您最後的通路時間是"+value);
break;
}
}
}
if(cookies==null||cookies.length==0||flag==false){
String time = new Date().toLocaleString();
time = time.replace(" ","");
String value = URLDecoder.decode(time,"utf-8");
Cookie cookie = new Cookie("lastTime",value);
response.addCookie(cookie);
response.getWriter().write("你好!歡迎您第一次來");
}
}
}
3. Session
3.1 概念:
伺服器端會話技術,在一次會話的多次請求間共享資料,将資料儲存在伺服器端的對象中。
會話的最明顯或者說最一般的特征是不能關閉浏覽器
Session: 伺服器端的會話技術(把多個請求需要共享的資料存在伺服器端)HttpSession
Cookie:用戶端的會話技術。(把多個請求需要共享的資料存在用戶端)Cookie
域對象
PageContext (jsp中使用的) 作用範圍是最小的 (隻在目前jsp頁面有效)
Request域 (一次請求過程中)
Session域 (一次會話過程中)
ServletContext域 (整個項目啟動之後都有效,在項目中共享資料)
3.2 方法
-
擷取HttpSession對象:
HttpSession session = request.getSession();
-
使用HttpSession對象:
Object getAttribute(String name)
void setAttribute(String name, Object value)
void removeAttribute(String name)
3.3 原理
Session的實作是依賴于Cookie的。
- 會話中的第一次請求擷取Session,伺服器會自動建立Session對象,并且會向用戶端給響應一個包含JSESSIONID–32位數字的Cookie對象,将JSESSIONID和Session對象存入session緩存
- 後續會話請求中擷取都是第一次建立的Session對象,通過請求中的cookie中的JSESSIONID從Session緩存中擷取Session對象
3.4 Session生存時間
Session有一個預設的生存時間(30分鐘内如果沒有被操作就會被删除)
選擇性配置修改 tomcat/conf/web.xml
<session-config>
<session-timeout>30</session-timeout>
</session-config>
覆寫上面的配置的話,可以在項目的web.xml中去覆寫
-
當用戶端關閉後,伺服器不關閉,兩次擷取session是否為同一個?
*預設情況下。不是。
*如果需要相同,則可以建立Cookie,鍵為JSESSIONID,設定最大存活時間,讓cookie持久化儲存。
Cookie c = new Cookie("JSESSIONID",session.getId()); c.setMaxAge(60*60);//伺服器操作的時候,沒有這一步,用的是預設-1 response.addCookie(c);
-
用戶端不關閉,伺服器關閉後,兩次擷取的session是同一個嗎?
不是同一個(記憶體中不是同一個),但是要確定資料不丢失。tomcat自動完成以下工作(tomcat通過下列操作會幫你完成session資料的恢複)
對象的序列化和反序列化
-
session的鈍化(對象的序列化:把記憶體中的對象,變成磁盤上的檔案):
在伺服器正常關閉之前,将session對象系列化到硬碟上
-
session的活化(對象的反序列化:把磁盤上的序列化對象的檔案,還原成記憶體中的對象):
在伺服器啟動後,将session檔案轉化為記憶體中的session對象即可。
- Session鈍化之前和活化之後的對象不是同一個對象,但是裡面的資料一樣。
-
-
session什麼時候被銷毀?
1. 伺服器關閉
2. session對象調用invalidate() 。
3. session預設失效時間 30分鐘
3.4 session的特點
- session用于存儲一次會話的多次請求的資料,存在伺服器端
- session可以存儲任意類型,任意大小的資料。cookie隻能存字元串
4. session與Cookie的差別:
- session存儲資料在伺服器端,Cookie在用戶端
- session沒有資料大小限制,Cookie有
- session資料安全,Cookie相對于不安全