Cookie技術(shù)
會(huì)話數(shù)據(jù)保存在瀏覽器客戶端仇哆。
Cookie類:用于存儲(chǔ)會(huì)話數(shù)據(jù)
- 構(gòu)造Cookie對(duì)象
Cookie(java.lang.String name, java.lang.String value)
- 設(shè)置cookie
void setPath(java.lang.String uri) :設(shè)置cookie的有效訪問(wèn)路徑
void setMaxAge(int expiry) : 設(shè)置cookie的有效時(shí)間
void setValue(java.lang.String newValue) :設(shè)置cookie的值
- 發(fā)送cookie到瀏覽器端保存
void response.addCookie(Cookie cookie) : 發(fā)送cookie
- 服務(wù)器接收cookie
Cookie[] request.getCookies() : 接收cookie
Cookie原理
- 服務(wù)器創(chuàng)建cookie對(duì)象,把會(huì)話數(shù)據(jù)存儲(chǔ)到cookie對(duì)象中甸箱。
new Cookie("name","value");
- 服務(wù)器發(fā)送cookie信息到瀏覽器
response.addCookie(cookie);
舉例: set-cookie: name=flynn (隱藏發(fā)送了一個(gè)set-cookie名稱的響應(yīng)頭)
- 瀏覽器得到服務(wù)器發(fā)送的cookie男旗,然后保存在瀏覽器端北戏。
- 瀏覽器在下次訪問(wèn)服務(wù)器時(shí)蒜胖,會(huì)帶著cookie信息
舉例: cookie: name=flynn (隱藏帶著一個(gè)叫cookie名稱的請(qǐng)求頭)
- 服務(wù)器接收到瀏覽器帶來(lái)的cookie信息
request.getCookies();
示例
public class CookieDemoServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1. 創(chuàng)建cookie對(duì)象
Cookie cookie = new Cookie("name", "flynn");
Cookie cookieEmail = new Cookie("email", "123@qq.com");
// 1.1 設(shè)置Cookie的有效的路徑今缚。默認(rèn)情況:有效路徑在當(dāng)前web應(yīng)用下算柳。
// cookie.setPath("");
// cookie.setMaxAge(20); //20秒 從最后不調(diào)用Cookie開(kāi)始計(jì)算
// cookie.setMaxAge(-1); // Cookie保存在瀏覽器內(nèi)存
// cookie.setMaxAge(0); // 刪除同名的Cookie
//2. 把Cookie數(shù)據(jù)發(fā)送到瀏覽器(通過(guò)響應(yīng)頭發(fā)送: Set-Cookie名稱)
// response.setHeader("Set-Cookie","name=flynn");
//推薦使用這種添加方式,避免手動(dòng)發(fā)送Cookie信息
response.addCookie(cookie);
response.addCookie(cookieEmail);
//3. 接收瀏覽器發(fā)達(dá)的Cookie的信息
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie c : cookies) {
String name = c.getName();
String value = c.getValue();
System.out.println(name + "=" + value);
}
} else {
System.out.println("沒(méi)有Cookie的數(shù)據(jù)!");
}
}
}
Cookie的細(xì)節(jié)
- void setPath(java.lang.String uri):
設(shè)置cookie的有效訪問(wèn)路徑姓言。有效路徑指的是cookie的有效路徑保存在哪里瞬项,那么瀏覽器在有效路徑下訪問(wèn)服務(wù)器時(shí)就會(huì)帶著cookie信息蔗蹋,否則不帶cookie信息。 - void setMaxAge(int expiry) : 設(shè)置cookie的有效時(shí)間囱淋。
- 正整數(shù):表示cookie數(shù)據(jù)保存瀏覽器的緩存目錄(硬盤中)猪杭,數(shù)值表示保存的時(shí)間。
- 負(fù)整數(shù):表示cookie數(shù)據(jù)保存瀏覽器的內(nèi)存中妥衣。瀏覽器關(guān)閉cookie就丟失了T硭薄!
零:表示刪除同名的cookie數(shù)據(jù) - Cookie數(shù)據(jù)類型只能保存非中文字符串類型的税手》涑铮可以保存多個(gè)cookie,但是瀏覽器一般只允許存放300個(gè)Cookie芦倒,每個(gè)站點(diǎn)最多存放20個(gè)Cookie艺挪,每個(gè)Cookie的大小限制為4KB。
代碼Demo
public class HistoryServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
// 獲取當(dāng)前的時(shí)間
// 環(huán)境Tomcat 9.0.0.M26下 開(kāi)始格式寫的“yyyy-MM-dd hh:mm:ss” 會(huì)報(bào)一個(gè)異常:An invalid character [32] was present in the Cookie value
SimpleDateFormat format = new SimpleDateFormat("hh:mm:ss");
String currentDate = format.format(new Date());
// 第一次訪問(wèn) (沒(méi)有Cookie或者 有Cookie但是沒(méi)有名為lastTime的Cookie)
Cookie[] cookies = request.getCookies();
String lastTime = null;
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("lastTime".equals(cookie.getName())) {
// 有l(wèi)astTime的Cookie 已經(jīng)是第n次訪問(wèn)
lastTime = cookie.getValue(); // 上次訪問(wèn)的時(shí)間
// 第n次訪問(wèn)
response.getWriter().write("歡迎回來(lái)熙暴,您上次訪問(wèn)的時(shí)間為:" + lastTime + ", 當(dāng)前時(shí)間為:" + currentDate);
cookie.setValue(currentDate);
cookie.setMaxAge(1 * 30 * 24 * 60 * 60); // 保存一個(gè)月
response.addCookie(cookie);
break;
}
}
}
if (cookies == null || lastTime == null) { // 第一次訪問(wèn) (沒(méi)有Cookie或者 有Cookie但是沒(méi)有名為lastTime的Cookie)
// 1.顯示當(dāng)前時(shí)間到瀏覽器
response.getWriter().write("您是首次訪問(wèn)本網(wǎng)站闺属,當(dāng)前時(shí)間為:" + currentDate);
// 2.創(chuàng)建Cookie對(duì)象
Cookie cookie = new Cookie("lastTime", currentDate);
cookie.setMaxAge(1 * 30 * 24 * 60 * 60); // 保存一個(gè)月
// 3.Cookie發(fā)送到瀏覽器
response.addCookie(cookie);
}
}
}
Session技術(shù)
Session特點(diǎn):
會(huì)話數(shù)據(jù)保存在服務(wù)器端。(內(nèi)存中)
Session技術(shù)核心
HttpSession類:用于保存會(huì)話數(shù)據(jù)
- 創(chuàng)建或得到session對(duì)象
HttpSession getSession()
HttpSession getSession(boolean create)
- 設(shè)置session對(duì)象
void setMaxInactiveInterval(int interval) : 設(shè)置session的有效時(shí)間
void invalidate() : 銷毀session對(duì)象
java.lang.String getId() : 得到session編號(hào)
- 保存會(huì)話數(shù)據(jù)到session對(duì)象
void setAttribute(java.lang.String name, java.lang.Object value) : 保存數(shù)據(jù)
java.lang.Object getAttribute(java.lang.String name) : 獲取數(shù)據(jù)
void removeAttribute(java.lang.String name) : 清除數(shù)據(jù)
Sesson細(xì)節(jié)
- java.lang.String getId() : 得到session編號(hào)
- 兩個(gè)getSession方法:
- getSession(true) / getSession() : 創(chuàng)建或得到session對(duì)象周霉。沒(méi)有匹配的session編號(hào)掂器,自動(dòng)創(chuàng) 建新的session對(duì)象。
- getSession(false): 得到session對(duì)象俱箱。沒(méi)有匹配的session編號(hào)国瓮,返回null
- void setMaxInactiveInterval(int interval) : 設(shè)置session的有效時(shí)間
session對(duì)象銷毀時(shí)間:- 3.1 默認(rèn)情況30分服務(wù)器自動(dòng)回收
- 3.2 修改session回收時(shí)間
- 3.3 全局修改session有效時(shí)間
- 3.4 手動(dòng)銷毀session對(duì)象
<!-- 修改session全局有效時(shí)間:分鐘 -->
<session-config>
<session-timeout>1</session-timeout>
</session-config>
void invalidate() : 銷毀session對(duì)象
- 如何避免瀏覽器的JSESSIONID的cookie隨著瀏覽器關(guān)閉而丟失的問(wèn)題
/**
* 手動(dòng)發(fā)送一個(gè)硬盤保存的cookie給瀏覽器
*/
Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(60*60);
response.addCookie(c);