Session原理,生命周期 | 您所在的位置:網(wǎng)站首頁(yè) › 屬雞男93年性格分析 › Session原理,生命周期 |
在WEB開發(fā)中,服務(wù)器可以為每個(gè)用戶瀏覽器創(chuàng)建一個(gè)會(huì)話對(duì)象(session對(duì)象),注意:一個(gè)瀏覽器獨(dú)占一個(gè)session對(duì)象(默認(rèn)情況下)。因此,在需要保存用戶數(shù)據(jù)(保存該瀏覽器(會(huì)話)的相關(guān)信息)時(shí),服務(wù)器程序可以把用戶數(shù)據(jù)寫到用戶瀏覽器獨(dú)占的session中,當(dāng)用戶使用瀏覽器訪問(wèn)其它程序時(shí),其它程序可以從用戶的session中取出該用戶的數(shù)據(jù),為用戶服務(wù)。 Session和Cookie的主要區(qū)別在于: Cookie是把用戶的數(shù)據(jù)寫給用戶的瀏覽器。 Session技術(shù)把用戶的數(shù)據(jù)寫到用戶獨(dú)占的session中(服務(wù)器端)。 Cookie由于存在客戶端,存在安全問(wèn)題,每次使用cookie都會(huì)在本地生成一個(gè)cookie文件 Session將數(shù)據(jù)存在服務(wù)器端,數(shù)據(jù)更加安全 Session將數(shù)據(jù)保存在服務(wù)器端,占用服務(wù)器資源,Cookie不會(huì)占用服務(wù)器的資源Session對(duì)象由服務(wù)器創(chuàng)建,開發(fā)人員可以調(diào)用request對(duì)象的getSession方法得到session對(duì)象。 例如:京東購(gòu)物車信息保存Cookie 、淘寶購(gòu)物車信息保存Session ? ? session對(duì)象:創(chuàng)建 HttpSession httpsession = request.getSession();? 存儲(chǔ)session httpsession.setAttribute(name,object);? 對(duì)于上述圖例的實(shí)現(xiàn),用IE6保存session數(shù)據(jù),當(dāng)前瀏覽器可以獲得,但是第二個(gè)IE6 無(wú)法獲得第一個(gè)瀏覽器保存Session 數(shù)據(jù),IE8以上 或 火狐瀏覽器:當(dāng)打開多個(gè)瀏覽器窗口,之間Session共享 原因:IE6 cookie 中保存jsessionId 默認(rèn)會(huì)話級(jí)別 ;IE8或者火狐 保存cookie中 jsessionId 默認(rèn)持久cookie (一)Session實(shí)現(xiàn)原理 ? 因此,若果將session id 持久化 ,IE6也可以實(shí)現(xiàn)上述功能。其中的Session Id 可以通過(guò)Session.getId()方法獲得(Session保存數(shù)據(jù)依賴于cookie來(lái)進(jìn)行實(shí)現(xiàn))。 將寫回給 瀏覽器 JSESSIONID 持久化(手動(dòng)) Cookie cookie = new Cookie("JSESSIONID",httpSession.getId()); cookie.setMaxAge(60 * 60); cookie.setPath("/history"); response.addCookie(cookie);因此,一般我們不允許用戶禁用cookie,如果意外遇到這種情況可以: 禁用cookie解決方案 ? 解決辦法:URL重寫 第二次訪問(wèn)服務(wù)器會(huì)帶一個(gè)URL,由于不能通過(guò)cookie方式傳遞SessionId,所以需要在URL中攜帶SessionId,例如: http://localhost:8080/shopping/readsession;jsessionid=xxx? 注意:攜帶SessionId信息是使用分號(hào)“;”而不是問(wèn)號(hào)“?” 因此在writesession中添加如下即可: String url = "/shopping/readsession"; // 對(duì)url 進(jìn)行重寫 拼接 jsessionid url = response.encodeURL(url); response.getWriter().println("查看保存內(nèi)容");問(wèn)題1:如果客戶端關(guān)閉瀏覽器,是否就刪除了Session ? 沒(méi)有,Session保存在服務(wù)器端 問(wèn)題2:IE6 保存Session,關(guān)閉瀏覽器,再次打開,數(shù)據(jù)丟失了? IE6默認(rèn)jsessionId保存會(huì)話Cookie中,關(guān)閉瀏覽器,會(huì)話cookie就會(huì)被刪除,客戶端丟失jsessionid 無(wú)法找到服務(wù)器對(duì)應(yīng)Session對(duì)象 服務(wù)器Session對(duì)象還存在(二)生命周期 Cookie生命周期: 創(chuàng)建 Cookie cookie = new Cookie(); response.addCookie(); 銷毀 會(huì)話cookie會(huì)在瀏覽器關(guān)閉時(shí)銷毀,持久cookie在cookie過(guò)期(MaxAge)后銷毀Session生命周期 ? 創(chuàng)建: HttpSession httpsession = request.getSession();創(chuàng)建session 銷毀 (例如,銷毀session即清空了購(gòu)物車) (1)服務(wù)器關(guān)閉時(shí)銷毀? (2) 手動(dòng)調(diào)用session.invalidate (可以設(shè)置一個(gè)按鈕(href實(shí)現(xiàn)),點(diǎn)擊實(shí)現(xiàn)購(gòu)物車的清空) request.getSession.invalidate(); response.sendRedirect("shopping/session/demo/cart.jsp");//重定向回購(gòu)物車界面(3)Session過(guò)期時(shí)銷毀,設(shè)置session過(guò)期的方法:? 1、配置web.xml 30? 2、調(diào)用session對(duì)象 setMaxInactiveInterval(int interval) 單位是秒 HttpSession session = request.getSession(); session.setMaxInactiveInterval(60*60); //設(shè)置session過(guò)期時(shí)間1小時(shí)? (三)Session的應(yīng)用舉例 Session的一個(gè)常見(jiàn)應(yīng)用就是購(gòu)物車功能的實(shí)現(xiàn): ? public class BuyServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1、獲得購(gòu)買商品編號(hào) String id = request.getParameter("id"); // 2、根據(jù)編號(hào) 得到商品名稱,實(shí)際工程是進(jìn)行數(shù)據(jù)庫(kù)查詢 String[] arr = { "冰箱", "洗衣機(jī)", "熱水器", "微波爐", "空調(diào)", "電飯鍋" }; String productName = arr[Integer.parseInt(id) - 1]; // 3、判斷商品名稱是否在購(gòu)物車中 /** *判斷購(gòu)物車是否存在,購(gòu)物車對(duì)象在Session中,因此購(gòu)物車應(yīng)該從 *Session中獲得,通過(guò)購(gòu)物車的名字,假設(shè)名字為“cart” */ Map cart = (Map) request.getSession() .getAttribute("cart"); // 可能返回 null if (cart == null) { // 購(gòu)物車對(duì)象不存在 cart = new HashMap(); } //商品名稱為key if (cart.containsKey(productName)) { // 購(gòu)物車存在該商品 數(shù)量+1 int number = cart.get(productName); cart.put(productName, number + 1); } else { // 商品沒(méi)有在購(gòu)物車中 cart.put(productName, 1); } // 將購(gòu)物車加入session request.getSession().setAttribute("cart", cart); response.setContentType("text/html;"); response.getWriter().println("商品已經(jīng)被加入購(gòu)物車!"); response.getWriter().println( "查看購(gòu)物車"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } |
CopyRight 2018-2019 實(shí)驗(yàn)室設(shè)備網(wǎng) 版權(quán)所有 |