會話技術
一次會話中包含多次請求和響應
一次會話:瀏覽器第一次給服務器資源發送請求,會話建立,知道有一方斷開爲止
功能: 在一次會話的範圍內的多次請求間,共享數據
方式:
1.客戶端會話技術:Cookie
2.服務器端會話技術:Session
1.Cooking
概念:客戶端會話技術,將數據保存到客戶端
快速入門
使用步驟:
1. 創建Cooking對象,綁定數據
new Cookie(String name, String value)
Cookie cookie = new Cookie(“msg”,“hello”);
2.發送Cooking對象
response.addCookie(Cookie cookie)
3.獲取Cooking,拿到數據
Cookie[ ] request.getCookies( )
cookie.getName(); //拿到cookie中的名稱
cookie.getValue(); //拿到cookie中的值
實現原理
cookie的細節:
- 一次可不可以發送多個cookie
可以
可以創建多個Cookie對象,使用response調用多次addCookie發送對象
2.cookie在瀏覽器中保存多久
1.默認情況下:當瀏覽器被關閉後,Cookie數據被銷燬
2.持久化存儲:
1.setMaxAge(int seconds)
參數:
1.正數
將Cookie數據寫到硬盤的文件中。持久化存儲
cookie存活時間。
2.負數
默認值
3.零
刪除Cookie信息
3.cookie 能不能存中文?
在TomCat 8 之前cookie 中不能直接存儲中文數據
在TomCat 8 之後cookie 中支持直接存儲中文路徑
特殊字符還是不支持 所有特殊字符還是使用URL編碼
在Tomcat 8 之前需要將中文數據轉碼 一般採用URL編碼(%E3)
1.URL編碼 將特殊字符轉成URL編碼類型
format = URLEncoder.encode(format,“utf-8”);
2.URL解碼
value = URLDecoder.decode(value,“utf-8”);
4.cookie共享問題
假設在一個tomcat服務器中,部署了多個web項目,那麼在這些web項目中cookie能不能共享
默認情況下cookie不能共享
setPath(String path):
設置cookie的獲取範圍,默認情況下,設置當前的虛擬目錄
如果需要共享,則可以將path設置爲“ / ”當前項目的根路徑
//設置path 讓當前服務器下部署的所有項目共享Cookie信息
cookie.setPath("/");
不同的tomcat服務器間cookie共享問題?
setDomain(String path):如果設置以及域名相同,那麼多個服務器之間cookie可以共享
setDomain(".baidu.com").那麼tieba.baidu.com 和 news.baidu.com中cookie可以共享
cookie的特點和作用:
1.cookie存儲數據在客戶端瀏覽器
2.瀏覽器對於單個cookie 的大小有限制(4kb),以及對同一個域名下的總cookie數量也有限制(20個)
作用:
cookie一般用於存儲少量的不太敏感的數據
在不登錄的情況下,完成服務器對客戶端的身份識別
案例:記住上一次訪問時間
1.訪問一個Servlet,如果是第一次訪問,則提示你好,歡迎您首次訪問
2.如果不是第一次訪問,則提示:歡迎回來,您上次訪問時間爲:顯示時間字符串
分析:
1.可以採用Cookie來完成
2.在服務器中的servlet來判斷是否有一個名爲ListTime的cookie
有:非第一次訪問
響應數據
更新時間
寫回cookie
寫回cookie中 需要注意日期字符串中有無特殊字符,有特殊字符需要使用URL編碼
沒有:第一次訪問
響應數據
寫回cookie
@WebServlet("/CookieTest")
public class CookieTest extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8"); //設置響應體消息的數據格式以及編碼
boolean result = false; //是否有ListTime的值
//獲取當前時間
Date date = new Date();
SimpleDateFormat simp = new SimpleDateFormat("yyyy年MM月dd日 HH時mm分ss秒");
String format = simp.format(date);
//URL編碼 將時間字符串中的特殊字符轉成URL編碼類型
format = URLEncoder.encode(format,"utf-8");
//獲取所有的cookie
Cookie[] cookies = request.getCookies();
//遍歷cookie
if (cookies != null && cookies.length>0){
for (Cookie cookie : cookies) {
//獲取cookie的名稱
String name = cookie.getName();
if ("ListTime".equals(name)){
//有該cookie 不是第一次訪問
result = true;
//響應數據
String value = cookie.getValue(); //獲取cookie的value 時間
//URL解碼
value = URLDecoder.decode(value,"utf-8");
response.getWriter().write("歡迎回來,您上次訪問時間爲:"+value);
//更新時間
cookie.setValue(format);
//設置cookie的存活時間
cookie.setMaxAge(60*60*24*30); //存活時間
response.addCookie(cookie);//發送cookie
break;
}
}
}
if (cookies == null || cookies.length==0 || result==false){
//首次訪問
Cookie cookie2 = new Cookie("ListTime",format);
cookie2.setMaxAge(60*60*24*30);
response.addCookie(cookie2);
response.getWriter().write("你好,歡迎您首次訪問");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
2.Session
概念:服務器端會話技術,在一次會話的多次請求間共享數據,將數據保存在服務器端的對象中。HttpSession
快速入門:
1.獲取HttpSession對象
HttpSession session = request.getSession();
2.HttpSession對象
Object getAttribute(String name)
void setAttribute(String name, Object value)
void removeValue(String name)
原理:
Session的實現 是依賴於Cookie的
細節:
1.當客戶端關閉後,服務器不關閉,兩次獲取session是否爲同一個
默認情況下不是
如果需要相同,則可以創建Cookie,鍵爲JSESSIONID 設置最大存活時間,讓cookie持久化保存
HttpSession session = request.getSession();
//期望客戶端關閉後,session也能相同
Cookie cookie = new Cookie("JSESSIONID",session.getId());
cookie.setMaxAge(60*60);
response.addCookie(cookie);
2.客戶端不關閉。服務器關閉後,兩次獲取的session是同一個嗎
不是同一個,但是要確保數據的不丟失
session的鈍化
在服務器正常關閉之前,將session對象序列化到硬盤上
session的活化
在服務器啓動後,將session文件轉化爲內存中的session對象即可
3.session什麼時間被銷燬?
1.服務器關閉
2.session對象調用invalidate()
3.session默認失效時間 30分鐘
選擇性的XML配置修改
<session-config>
<session-timeout>30</session-timeout>
<session-config>
特點:
1.session用於存儲一次會話的多次請求的數據,存在服務器端
2.session可以存儲任意類型,任意大小的數據
session 與 Cookie的區別
1.session存儲數據在服務器端,Cookie在客戶端
2.session沒有數據大小限制,cookie有大小限制
3.session數據安全,Cookie相對不安全