- 在temp代碼模板中推掸,有需要變換的部分桶蝎,打出$符號驻仅,在后面選擇{cursor}
- 會話開始是瀏覽器客戶端打開相應(yīng)網(wǎng)頁,結(jié)束是瀏覽器關(guān)閉(在windows中的內(nèi)存結(jié)束)
獲得cookie只有一個方法:getcookies() - 一臺電腦可以有多個客戶端
- 新session創(chuàng)建條件(客戶端沒有第一次訪問登渣,客戶端清除cookie服務(wù)器端還有雾家,服務(wù)器端定期清除session)就是訪問資源時候getsession會開客戶端有沒有,沒有就創(chuàng)建
- session過期:服務(wù)器關(guān)閉绍豁,session過期芯咧,手動銷毀
- session過期時間都在做自己的web.xml中配置不在代碼中設(shè)置
<session-config>
三十分鐘過期
<session-timeout>30</session-timeout>
</session-config>
- session中的jsession是依存于cookie而存在的要想長期存在
- 一個思想是服務(wù)器面對的是許多不確定的客戶端而不是一個
- session不存不經(jīng)常用的比如(驗(yàn)證碼粗偶信息)減少服務(wù)器壓力
- 兩個servlet傳遞數(shù)據(jù)時候使用session(比如驗(yàn)證圖片信息inmservlet傳遞到loginservlet)
- 會話技術(shù):從打開一個瀏覽器訪問某個站點(diǎn),到關(guān)閉這個瀏覽器的整個過程竹揍,成為一次會話敬飒。
- 會話技術(shù)分為Cookie和Session:
Cookie:數(shù)據(jù)存儲在客戶端本地,減少服務(wù)器端的存儲的壓力芬位,安全性不好无拗,客戶端 可以清除cookie
Session:將數(shù)據(jù)存儲到服務(wù)器端,安全性相對好昧碉,增加服務(wù)器的壓力
1)創(chuàng)建Cookie:
Cookie cookie = new Cookie("username"英染,"zhangsan");
那么該cookie會以響應(yīng)頭的形式發(fā)送給客戶端:
2)設(shè)置Cookie在客戶端的持久化時間:
cookie.setMaxAge(int seconds); ---時間秒
注意:如果不設(shè)置持久化時間,cookie會存儲在瀏覽器的內(nèi)存中被饿,瀏覽器關(guān)閉 cookie信息銷毀(會話級別的cookie)四康,如果設(shè)置持久化時間,cookie信息會被持久化到瀏覽器的磁盤文件里
示例:
cookie.setMaxAge(10*60);
設(shè)置cookie信息在瀏覽器的磁盤文件中存儲的時間是10分鐘狭握,過期瀏覽器 自動刪除該cookie信息
3)設(shè)置Cookie的攜帶路徑:
cookie.setPath(String path);
注意:如果不設(shè)置攜帶路徑闪金,那么該cookie信息默認(rèn)會在訪問產(chǎn)生該cookie的web資源所在的路徑都攜帶cookie信息(同一級)
示例:
cookie.setPath("/WEB16");
代表訪問WEB16應(yīng)用中的任何資源都攜帶cookie
cookie.setPath("/WEB16/cookieServlet");
代表訪問WEB16中的cookieServlet時才攜帶cookie信息
cookie.setPath("/");//訪問服務(wù)器下的所有的資源都攜帶這個cookie
4)向客戶端發(fā)送cookie:
response.addCookie(Cookie cookie);
5)刪除客戶端的cookie:
如果想刪除客戶端的已經(jīng)存儲的cookie信息,那么就使用同名同路徑的持久化時 間為0的cookie進(jìn)行覆蓋即可
//刪除客戶端保存 name=zhangsan的cookie信息
Cookie cookie = new Cookie("name","");
//將path設(shè)置成與要刪除cookie的path一致
cookie.setPath("/WEB16");
//設(shè)置時間是0
cookie.setMaxAge(0);
response.addCookie(cookie);
-------------------------------------------
服務(wù)器端接受cookie
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 獲得客戶端攜帶的cookie的數(shù)據(jù)
Cookie[] cookies = request.getCookies();
// Cookie cookie = new Cookie("name","zhangsan");
// 通過cookie名稱獲得想要的cookie
if (cookies != null) {
for (Cookie cookie : cookies) {
// 獲得cookie的名稱
String cookieName = cookie.getName();
if (cookieName.equals("name")) {
// 獲得該cookie的值
String cookieValue = cookie.getValue();
System.out.println(cookieValue);
}
}
}
}
---------------顯示上次登錄時間---------------------
public class LastAccessTimeServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 獲得當(dāng)前時間
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String currentTime = format.format(date);
// 1论颅、創(chuàng)建Cookie 記錄當(dāng)前的最新的訪問時間
Cookie cookie = new Cookie("lastAccessTime", currentTime);
cookie.setMaxAge(60 * 10 * 500);
response.addCookie(cookie);
// 2哎垦、獲得客戶端攜帶cookie ---- lastAccessTime
String lastAccessTime = null;
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie coo : cookies) {
if ("lastAccessTime".equals(coo.getName())) {
lastAccessTime = coo.getValue();
}
}
}
response.setContentType("text/html;charset=UTF-8");
if (lastAccessTime == null) {
response.getWriter().write("您是第一次訪問");
} else {
response.getWriter().write("您上次的訪問的時間是:" + lastAccessTime);
}
}
2.Session也是一個域?qū)ο?/p>
- Session技術(shù)是將數(shù)據(jù)存儲在服務(wù)器端的技術(shù),會為每個客戶端都創(chuàng)建一塊內(nèi)存空間 存儲客戶的數(shù)據(jù)恃疯,但客戶端需要每次都攜帶一個標(biāo)識ID去服務(wù)器中尋找屬于自己的內(nèi) 存空間漏设。所以說Session的實(shí)現(xiàn)是基于Cookie,Session需要借助于Cookie存儲客 戶的唯一性標(biāo)識JSESSIONID
1.獲得Session對象
HttpSession session = request.getSession();
此方法會獲得專屬于當(dāng)前會話的Session對象今妄,如果服務(wù)器端沒有該會話的Session 對象會創(chuàng)建一個新的Session返回郑口,如果已經(jīng)有了屬于該會話的Session直接將已有的Session返回(實(shí)質(zhì)就是根據(jù)JSESSIONID判斷該客戶端是否在服務(wù)器上已經(jīng)存在session了)
2.向session中存取數(shù)據(jù)(session也是一個域?qū)ο螅?Session也是存儲數(shù)據(jù)的區(qū)域?qū)ο螅詓ession對象也具有如下三個方法:
session.setAttribute(String name,Object obj);
session.getAttribute(String name);
session.removeAttribute(String name);
3.Session對象的生命周期(面試題/筆試題)
創(chuàng)建:第一次執(zhí)行request.getSession()時創(chuàng)建
銷毀:
1)服務(wù)器(非正常)關(guān)閉時
2)session過期/失效(默認(rèn)30分鐘)
問題:時間的起算點(diǎn) 從何時開始計(jì)算30分鐘蛙奖?
從不操作服務(wù)器端的資源開始計(jì)時
可以在工程的web.xml中進(jìn)行配置
<session-config>
<session-timeout>30</session-timeout>
</session-config>
3)手動銷毀session
session.invalidate();
作用范圍:
默認(rèn)在一次會話中潘酗,也就是說在,一次會話中同一個客戶端任何資源公用一個session對象
面試題:瀏覽器關(guān)閉雁仲,session就銷毀了仔夺? 不對
總結(jié):
會話技術(shù):
Cookie技術(shù):存到客戶端
發(fā)送cookie
Cookie cookie = new Cookie(name,value)
cookie.setMaxAge(秒)
cookie.setPath()
response.addCookie(cookie)
獲得cookie
Cookie[] cookies = request.getCookies();
cookie.getName();
cookie.getValue();
Session技術(shù):存到服務(wù)器端 借助cookie存儲JSESSIONID
HttpSession session = request.getSession();
setAttribute(name,value);
getAttribute(name);
session生命周期
創(chuàng)建:第一次指定request.getSession();
銷毀:服務(wù)器關(guān)閉、session失效/過期攒砖、手動session.invalidate();
session作用范圍:默認(rèn)一會話中
----------------延長jsession時間就是自己重新寫一次所在cookie的時間-----------------
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//創(chuàng)建屬于該客戶端(會話)的私有的session區(qū)域
/* request.getSession()方法內(nèi)部會判斷 該客戶端是否在服務(wù)器端已經(jīng)存在session
* 如果該客戶端在此服務(wù)器不存在session 那么就會創(chuàng)建一個新的session對象
* 如果該客戶端在此服務(wù)器已經(jīng)存在session 獲得已經(jīng)存在的該session返回
*/
HttpSession session = request.getSession();
session.setAttribute("name", "jerry");
String id = session.getId();//該session對象的編號id
//手動創(chuàng)建一個存儲JSESSIONID的Cookie 為該cookie設(shè)置持久化時間
Cookie cookie = new Cookie("JSESSIONID",id);
cookie.setPath("/WEB16/");
cookie.setMaxAge(60*10);
response.addCookie(cookie);
response.getWriter().write("JSESSIONID:"+id);
}