- 在temp代碼模板中,有需要變換的部分,打出$符號,在后面選擇{cursor}
- 會話開始是瀏覽器客戶端打開相應網(wǎng)頁,結(jié)束是瀏覽器關(guān)閉(在windows中的內(nèi)存結(jié)束)
獲得cookie只有一個方法:getcookies() - 一臺電腦可以有多個客戶端
- 新session創(chuàng)建條件(客戶端沒有第一次訪問,客戶端清除cookie服務器端還有,服務器端定期清除session)就是訪問資源時候getsession會開客戶端有沒有,沒有就創(chuàng)建
- session過期:服務器關(guān)閉,session過期,手動銷毀
- session過期時間都在做自己的web.xml中配置不在代碼中設(shè)置
<session-config>
三十分鐘過期
<session-timeout>30</session-timeout>
</session-config>
- session中的jsession是依存于cookie而存在的要想長期存在
- 一個思想是服務器面對的是許多不確定的客戶端而不是一個
- session不存不經(jīng)常用的比如(驗證碼粗偶信息)減少服務器壓力
- 兩個servlet傳遞數(shù)據(jù)時候使用session(比如驗證圖片信息inmservlet傳遞到loginservlet)
- 會話技術(shù):從打開一個瀏覽器訪問某個站點,到關(guān)閉這個瀏覽器的整個過程,成為一次會話。
- 會話技術(shù)分為Cookie和Session:
Cookie:數(shù)據(jù)存儲在客戶端本地,減少服務器端的存儲的壓力,安全性不好,客戶端 可以清除cookie
Session:將數(shù)據(jù)存儲到服務器端,安全性相對好,增加服務器的壓力
1)創(chuàng)建Cookie:
Cookie cookie = new Cookie("username","zhangsan");
那么該cookie會以響應頭的形式發(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信息默認會在訪問產(chǎn)生該cookie的web資源所在的路徑都攜帶cookie信息(同一級)
示例:
cookie.setPath("/WEB16");
代表訪問WEB16應用中的任何資源都攜帶cookie
cookie.setPath("/WEB16/cookieServlet");
代表訪問WEB16中的cookieServlet時才攜帶cookie信息
cookie.setPath("/");//訪問服務器下的所有的資源都攜帶這個cookie
4)向客戶端發(fā)送cookie:
response.addCookie(Cookie cookie);
5)刪除客戶端的cookie:
如果想刪除客戶端的已經(jīng)存儲的cookie信息,那么就使用同名同路徑的持久化時 間為0的cookie進行覆蓋即可
//刪除客戶端保存 name=zhangsan的cookie信息
Cookie cookie = new Cookie("name","");
//將path設(shè)置成與要刪除cookie的path一致
cookie.setPath("/WEB16");
//設(shè)置時間是0
cookie.setMaxAge(0);
response.addCookie(cookie);
-------------------------------------------
服務器端接受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 {
// 獲得當前時間
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String currentTime = format.format(date);
// 1、創(chuàng)建Cookie 記錄當前的最新的訪問時間
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ù)存儲在服務器端的技術(shù),會為每個客戶端都創(chuàng)建一塊內(nèi)存空間 存儲客戶的數(shù)據(jù),但客戶端需要每次都攜帶一個標識ID去服務器中尋找屬于自己的內(nèi) 存空間。所以說Session的實現(xiàn)是基于Cookie,Session需要借助于Cookie存儲客 戶的唯一性標識JSESSIONID
1.獲得Session對象
HttpSession session = request.getSession();
此方法會獲得專屬于當前會話的Session對象,如果服務器端沒有該會話的Session 對象會創(chuàng)建一個新的Session返回,如果已經(jīng)有了屬于該會話的Session直接將已有的Session返回(實質(zhì)就是根據(jù)JSESSIONID判斷該客戶端是否在服務器上已經(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)服務器(非正常)關(guān)閉時
2)session過期/失效(默認30分鐘)
問題:時間的起算點 從何時開始計算30分鐘?
從不操作服務器端的資源開始計時
可以在工程的web.xml中進行配置
<session-config>
<session-timeout>30</session-timeout>
</session-config>
3)手動銷毀session
session.invalidate();
作用范圍:
默認在一次會話中,也就是說在,一次會話中同一個客戶端任何資源公用一個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ù):存到服務器端 借助cookie存儲JSESSIONID
HttpSession session = request.getSession();
setAttribute(name,value);
getAttribute(name);
session生命周期
創(chuàng)建:第一次指定request.getSession();
銷毀:服務器關(guān)閉、session失效/過期、手動session.invalidate();
session作用范圍:默認一會話中
----------------延長jsession時間就是自己重新寫一次所在cookie的時間-----------------
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//創(chuàng)建屬于該客戶端(會話)的私有的session區(qū)域
/* request.getSession()方法內(nèi)部會判斷 該客戶端是否在服務器端已經(jīng)存在session
* 如果該客戶端在此服務器不存在session 那么就會創(chuàng)建一個新的session對象
* 如果該客戶端在此服務器已經(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);
}