至此,學習Servlet三個域對象:ServletContext(web項目)、request(一次請求)、Session(一個客戶端)!均有相同的方法!html
從用戶開始打開瀏覽器進行操做,便開始了一次會話,直相當閉瀏覽器爲止結束。在此過程當中,每次產生請求時均會產生一次cookie,同時會產生一個JESSIONID進入到客戶端進行建立內存空間,下次調用直接尋找此惟一的ID值。數據存儲在兩個地方均有利弊!須要注意的是,瀏覽器關閉,session並無銷燬!web
1、會話技術簡介:數組
一、存儲客戶端的狀態:瀏覽器
由於Http協議是無狀態的,也就是說每一個客戶訪問服務器端資源時,服務器並不知道該客戶端是誰,因此須要會話技術識別客戶端的狀態。安全
會話技術是幫助服務器記住客戶端狀態(區分客戶端)服務器
二、會話技術:cookie
①、從打開一個瀏覽器訪問某個站點,到關閉這個瀏覽器的整個過程,成爲一次會話。會話技術就是記錄此次會話中客戶端的狀態與數據的。session
②、會話技術分爲Cookie 和Session:學習
Cookie:數據存儲在客戶端本地,減小服務器端的存儲的壓力,安全性很差,客戶端能夠清楚cookie.spa
Session:將數據存儲到服務器端,安全性相對好,增長服務器的壓力。
2、Cookie技術:
一、服務器向客戶端發送一個Cookie(不能存中文)
Cookie cookie=new Cookie(String name,String value)
二、設置cookie在客戶端的持久化時間:
cookie.setMaxAge(int seconds)
若是不設置持久化時間,cookie會存儲到瀏覽器的內存中,瀏覽器關閉時cookie信息銷燬。設置了的話,會在規定的時間內存在。
三、設置cookie的攜帶路徑:
cookie.setPath(String path)
若是不設置攜帶路徑,cookie信息在訪問 產生 該cookie的web資源所在的路徑 都攜帶cookie信息。
四、向客戶端發送cookie
response.addCookie(Cookie cookie)
五、刪除客戶端的cookie
使用同名同路徑的持久化時間爲0的cookie進行覆蓋
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //建立Cookie對象 Cookie cookie= new Cookie("godds","naiping"); //設置持久化時間(從請求Servlet開始) cookie.setMaxAge(60*2); //設置cookie攜帶路徑(只有訪問此路徑才攜帶) //cookie.setPath("/WEB07/SendCookieServlet"); /*cookie.setPath("/WEB07"); cookie.setPath("/");*/ //發送 response.addCookie(cookie); }
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //刪除Cookie Cookie cookie = new Cookie("goods","naiping"); cookie.setMaxAge(0); response.addCookie(cookie); }
六、服務器接收客戶端攜帶cookie的方式:
以請求頭的方式發送到服務器端的
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //獲取cookie數組 Cookie[] cookies = request.getCookies(); //遍歷cookie數組經過cookie名獲取cookie值 for(Cookie c:cookies){ if(c.getName().equals("goods")){ System.out.println(c.getValue()); } }
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //獲取當前的時間對象 Date date = new Date(); //建立日期轉換類對象 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss"); //將日期對象轉爲字符串 String time = sdf.format(date); //建立cookie對象,記錄當前訪問時間 Cookie cookie = new Cookie("lastTime",time); cookie.setMaxAge(60*10); //發送cookie response.addCookie(cookie); //接收cookie Cookie[] cookies = request.getCookies(); //定義變量存儲上次訪問時間 String lastTime = null; //遍歷 for(Cookie c:cookies){ if(c.getName().equals("lastTime")){ lastTime=c.getValue(); } } //解決響應亂碼 response.setContentType("text/html;charset=utf-8"); if(lastTime==null){ //第一次訪問 response.getWriter().write("您是第一次訪問"); }else{ response.getWriter().write("您上次訪問時間爲"+lastTime); } }
3、Session技術:(一個域對象)
一、簡介:
Session技術是將數據存儲在服務器端的技術,會爲每一個客戶端都建立一塊內存空間 存儲客戶的數據,但客戶端須要每次都攜帶一個標識ID去服務器中尋找屬於本身的內存空間。因此說Session的實現是基於Cookie,Session須要藉助於Cookie存儲客戶的惟一性標識JSESSIONID。
二、得到Session對象:
HttpSession session = request.getSession()
此方法會得到專屬於當前會話(當前客戶端)的Session對象,若是服務器端沒有該會話的Session對象會建立一個新的Session返回,若是已經有了屬於該會話的Session直接將已有 的Session返回(實質就是根據JSESSIONID判斷該客戶端是否在服務器上已經存在session了)
三、域對象的存取數據;
四、生命週期:
①、建立:
第一次執行 request.getSession() 時建立
②、銷燬:
服務器非正常關閉時;
Session 過時、失效(默認30分鐘)
手動銷燬Session
③、做用範圍:
默認在一次會話中,也就是說,在一次會話中任何資源公用一個session對象。
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //獲取Session域中的內容 HttpSession session = request.getSession(); //獲取Session中的內容 String goods = (String)session.getAttribute("goods"); //解決亂碼 response.setContentType("text/html;charset=utf-8"); response.getWriter().write(goods); }
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //獲取Session對象 HttpSession session = request.getSession(); //向Session域中存儲數據(cookie不能存漢字) session.setAttribute("goods", "奶瓶"); //獲取JESSIONID String id = session.getId(); //設置持久化時間---建立一個新的cookie設置其時間並覆蓋原來的 //建立Cookie Cookie cookie = new Cookie("JSESSIONID",id); cookie.setPath("/WEB08"); cookie.setMaxAge(60*3); //發送cookie response.addCookie(cookie); response.getWriter().write("JSESSIONID:"+id); //結果 JSESSIONID:0CDD85B8A6E216CA5BDA8E9729D5F230 }