一、今日內(nèi)容
1. Cookie
1. Cookie概述
2. Cookie實現(xiàn)原理
3. Cookie的細(xì)節(jié)
4. Cookie的特點和作用
5. 時間記錄案例
2. Session
1. Sesstion概述
2. Sesstion原理
3. Sesstion細(xì)節(jié)
4. Sesstion特點
二、Cookie
1. Cookie概述
1. Cookie概念:客戶端會話技術(shù),將數(shù)據(jù)保存到客戶端
2. 快速入門:
* 使用步驟:
1. 創(chuàng)建Cookie對象,綁定數(shù)據(jù)
* new Cookie(String name, String value)
2. 發(fā)送Cookie對象
* response.addCookie(Cookie cookie)
3. 獲取Cookie,拿到數(shù)據(jù)
* Cookie[] request.getCookies()
* 對于Cookie有以下兩個方法
String cookieName = cookie.getName();
String cookieValue = cookie.getValue();
2. Cookie實現(xiàn)原理
基于響應(yīng)頭set-cookie和請求頭cookie實現(xiàn)
[圖片上傳失敗...(image-6ecb73-1584450309728)]
3. Cookie的細(xì)節(jié)
1. 一次可不可以發(fā)送多個cookie?
* 可以
* 可以創(chuàng)建多個Cookie對象,使用response調(diào)用多次addCookie方法發(fā)送cookie即可。
2. cookie在瀏覽器中保存多長時間?
1. 默認(rèn)情況下,當(dāng)瀏覽器關(guān)閉后,Cookie數(shù)據(jù)被銷毀
2. 持久化存儲:
* setMaxAge(int seconds)
1. 正數(shù):將Cookie數(shù)據(jù)寫到硬盤的文件中。持久化存儲。并指定cookie存活時間,正數(shù)就是存活秒數(shù)。時間到后,cookie文件自動失效
2. 負(fù)數(shù):默認(rèn)值
3. 零:刪除cookie信息
3. cookie能不能存中文?
* 在tomcat 8 之前 cookie中不能直接存儲中文數(shù)據(jù)。
* 需要將中文數(shù)據(jù)轉(zhuǎn)碼---一般采用URL編碼(%E3)
* 在tomcat 8 之后,cookie支持中文數(shù)據(jù)。特殊字符還是不支持,建議使用URL編碼存儲,URL解碼解析
4. cookie共享問題?
1. 假設(shè)在一個tomcat服務(wù)器中,部署了多個web項目,那么在這些web項目中cookie能不能共享?
* 默認(rèn)情況下cookie不能共享
* setPath(String path):設(shè)置cookie的獲取范圍。默認(rèn)情況下,設(shè)置當(dāng)前項目的虛擬目錄
* 如果要共享,則可以將path設(shè)置為"/"
2. 不同的tomcat服務(wù)器間cookie共享問題?
* setDomain(String path):如果設(shè)置一級域名相同,那么多個服務(wù)器之間cookie可以共享
* setDomain(".baidu.com"),那么tieba.baidu.com和news.baidu.com中cookie可以共享
4. Cookie的特點和作用
1. 特點:
1. cookie存儲數(shù)據(jù)在客戶端瀏覽器(不太安全)
2. 瀏覽器對于單個cookie 的大小有限制(4kb) 以及 對同一個域名下的總cookie數(shù)量也有限制(20個)
2. 作用:
1. cookie一般用于存出少量的不太敏感的數(shù)據(jù)
2. 在不登錄的情況下,完成服務(wù)器對客戶端的身份識別。比如,偏好設(shè)置。
5. 時間記錄案例
需求:
- 訪問一個Servlet,如果是第一次訪問,則提示:您好,歡迎您首次訪問。
- 如果不是第一次訪問,則提示:歡迎回來,您上次訪問時間為:顯示時間字符串
效果:

在這里插入圖片描述
分析:
- 可以采用Cookie來完成
- 在服務(wù)器中的Servlet判斷是否有一個名為lastTime的cookie
- 有:不是第一次訪問
- 響應(yīng)數(shù)據(jù):歡迎回來,您上次訪問時間為:2018年6月10日11:50:20
- 寫回Cookie:lastTime=2018年6月10日11:50:01
- 沒有:是第一次訪問
- 響應(yīng)數(shù)據(jù):您好,歡迎您首次訪問
- 寫回Cookie:lastTime=2018年6月10日11:50:01
代碼實現(xiàn):
@WebServlet("/cookieServlet")
public class CookieServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//1.獲取cookies
Cookie[] cookies = request.getCookies();
boolean flag = false;
//2.判斷cookies中是否有l(wèi)astTime
if (cookies != null && cookies.length >0) {
for (Cookie cookie : cookies) {
String name = cookie.getName();
if ("lastTime".equals(name)) {
flag = true;
//2.1 有,則生成新的lastTime值,響應(yīng)數(shù)據(jù)并返回
//顯示上次時間
String lastTime = cookie.getValue();
lastTime = URLDecoder.decode(lastTime, "utf-8");
response.getWriter().write("<h1>歡迎回來,您上次訪問時間為:"+lastTime+"</h1>");
String str_date = this.getDate();
//響應(yīng)數(shù)據(jù)
cookie.setValue(str_date);
cookie.setMaxAge(60 * 60 * 24 * 30); //cookie保存一個月
response.addCookie(cookie);
}
}
}
//2.2 無,則設(shè)置lastTime值為時間,響應(yīng)數(shù)據(jù)并返回
if (cookies == null || cookies.length ==0 || flag == false) {
String str_date = this.getDate();
Cookie cookie = new Cookie("lastTime", str_date);
response.addCookie(cookie);
response.getWriter().write("<h1>您好,歡迎您首次訪問</h1>");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
protected String getDate() {
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String str_date = sdf.format(date);
try {
str_date = URLEncoder.encode(str_date, "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
//采用url將中文編碼
return str_date;
}
}
三、Sesstion
1. Sesstion概述
1. 概念:服務(wù)器端會話技術(shù),在一次會話的多次請求間共享數(shù)據(jù),將數(shù)據(jù)保存在服務(wù)器端的對象中。瀏覽器關(guān)閉視為會話結(jié)束。HttpSession
2. 快速入門:
1. 獲取HttpSession對象:
HttpSession session = request.getSession();
2. 使用HttpSession對象:
* session是域?qū)ο?,所以有以下三個方法:
Object getAttribute(String name)
void setAttribute(String name, Object value)
void removeAttribute(String name)
2. Sesstion原理
原理
* Session的實現(xiàn)是依賴于Cookie的。
[圖片上傳失敗...(image-935a9e-1584450309728)]
3. Sesstion細(xì)節(jié)
1. 當(dāng)客戶端關(guān)閉后,服務(wù)器不關(guān)閉,兩次獲取session是否為同一個?
* 默認(rèn)情況下。不是。
* 如果需要相同,則可以創(chuàng)建Cookie,鍵為JSESSIONID,設(shè)置最大存活時間,讓cookie持久化保存。
Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(60*60);
response.addCookie(c);
2. 客戶端不關(guān)閉,服務(wù)器關(guān)閉后,兩次獲取的session是同一個嗎?
* 不是同一個,但是要確保數(shù)據(jù)不丟失。tomcat自動完成以下工作
* session的鈍化:
* 在服務(wù)器正常關(guān)閉之前,將session對象系列化到硬盤上
* session的活化:
* 在服務(wù)器啟動后,將session文件轉(zhuǎn)化為內(nèi)存中的session對象即可。
* 注意:idea連接Tomcat不能
3. session什么時候被銷毀?
1. 服務(wù)器關(guān)閉
2. session對象調(diào)用invalidate() 。會刪除該會話。
3. session默認(rèn)失效時間 30分鐘內(nèi)不進(jìn)行活動
選擇性配置修改默認(rèn)失效時間:在Tomcat/conf/web.xml
<session-config>
<session-timeout>30</session-timeout>
</session-config> |
|
修改此時間
4. Sesstion特點
1. session用于存儲一次會話的多次請求的數(shù)據(jù),存在服務(wù)器端
2. session可以存儲任意類型,任意大小的數(shù)據(jù)
* session與Cookie的區(qū)別:
1. session存儲數(shù)據(jù)在服務(wù)器端,Cookie在客戶端
2. session沒有數(shù)據(jù)大小限制,Cookie有
3. session數(shù)據(jù)安全,Cookie相對于不安全