1. 程式人生 > >2018年5月9日JAVA-servlet02

2018年5月9日JAVA-servlet02

127.0.0.1 超過 即使 ddc spa 比較 寫入 方便 void

  1. session對象用於在會話範圍內,記錄每個客戶端的訪問狀態,以便於跟蹤每個客戶端的操作狀態,在會話存儲的信息,在瀏覽器發出後續請求時可以獲取這些會話的有效數據。
  2. 在jsp頁面中可以直接使用session對象(jsp的內置對象),也可以通過pageContext.getSession()或者request.getSession重新回去session對象。
  3. session可以保存用戶的信息和實現購物車等功能。
  4. HTTP協議是一種無狀態協議,客戶向服務器發出的請求request,然後服務器返回響應response,連接就被關閉了,在服務器不保存連接的有關信息,因此在下一次連接時,服務器已經沒有以前的連接信息了,無法判斷這一次連接和上一次連接時同一個客戶信息,因此,必須使用會話記錄有關連接的信息。
  5. 從客戶打開瀏覽器連接到服務器,到客戶關閉瀏覽器離開這個服務器,稱做一個會話。當客戶訪問服務器是,可能會反復連接這個服務器上的幾個頁面、反復刷新一個頁面或不斷地向一個頁面提交信息等,服務器應當通過某種方法知道這是同一個客戶,這時就需要session對象。
  6. session的工作原理如下:
  7. 1、客戶首次訪問服務器的一個頁面時,服務器就會為該用戶分配一個session對象,同時為這個session指定唯一的ID,並且將該ID發送到客戶端並寫入到cookie中,使得客戶端與服務器的session建立一一對應的關系;
  8. 2、當客戶端繼續訪問服務器端的其它資源時,服務器不再為該客戶分配新的session對象,直到客戶端瀏覽器關閉、超時或調用session的invalidate()方法使其失效,客戶端與服務器的會話結束。
  9. 3、當客戶重新打開瀏覽器訪問網站時,服務器會重新為客戶分配一個session對象,並重新分配sessionID。
  10. session對象主要用於屬性操作和會話管理,常用方法如下:
  11. 1、public void setAttribute(String name,String value)設定指定名字的屬性的值,並將它添加到session會話範圍內,如果這個屬性是會話範圍內存在,則更改該屬性的值。
  12. 2、public Object getAttribute(String name)在會話範圍內獲取指定名字的屬性的值,返回值類型為object,如果該屬性不存在,則返回null。
  13. 3、public void removeAttribute(String name),刪除指定名字的session屬性,若該屬性不存在,則出現異常。
  14. 4、public void invalidate(),使session失效。可以立即使當前會話失效,原來會話中存儲的所有對象都不能再被訪問。
  15. 5、public String getId( ),獲取當前的會話ID。每個會話在服務器端都存在一個唯一的標示sessionID,session對象發送到瀏覽器的唯一數據就是sessionID,它一般存儲在cookie中。
  16. 6、public void setMaxInactiveInterval(int interval) 設置會話的最大持續時間,單位是秒,負數表明會話永不失效。
  17. 7、public int getMaxInActiveInterval(),獲取會話的最大持續時間。
  18. 8、使用session對象的getCreationTime()和getLastAccessedTime()方法可以獲取會話創建的時間和最後訪問的時間,但其返回值是毫秒,一般需要使用下面的轉換來獲取具體日期和時間。
  19. Date creationTime = new Date(session.getCreationTime());
  20. Date accessedTime = new Date(session.getLastAccessedTime());
  21. <%@ page language="java" import="java.util.*" contentType="text/html;charset=GBK"%>  
    <%  
    String path = request.getContextPath();  
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
    %>  
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
    <html>  
      <head>  
        <base href="<%=basePath%>">  
         
        <title>session對象方法</title>  
         
     <meta http-equiv="pragma" content="no-cache">  
     <meta http-equiv="cache-control" content="no-cache">  
     <meta http-equiv="expires" content="0">     
     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
     <meta http-equiv="description" content="This is my page">  
     <!--  
     <link rel="stylesheet" type="text/css" href="styles.css">  
     -->  
      </head>  
       
      <body>  
        <b>  
        會話ID:<%=session.getId() %> <br>  
        是否新會話:<%=session.isNew() %><br>  
        設置和獲取屬性對象:用戶名 =  
        <%session.setAttribute("用戶名","bing"); %>  
        <%=session.getAttribute("用戶名") %><br>  
        <%  
        Date creationTime = new Date(session.getCreationTime());  
        Date accessedTime = new Date(session.getLastAccessedTime());  
         %>  
         會話創建時間:<%=creationTime %><br>  
         上次訪問時間:<%=accessedTime %><br>  
         會話持續時間(s):<%=session.getMaxInactiveInterval() %><br>  
         <%session.setMaxInactiveInterval(12); %>  
         修改後的會話持續時間(s):<%=session.getMaxInactiveInterval() %><br>  
         <%session.invalidate(); %>  
         </b>  
      </body>  
    </html>  
  22. 瀏覽器在訪問服務器時,服務器將一些數據以 set-cookie 消息頭的形式發送給瀏覽器。瀏覽器會將這些數據保存起來。當瀏覽器再次訪問服務器時,會將這些數據以 cookie 消息頭的形式發送給服務器。

    2、創建 cookie

    Cookie cookie = new Cookie(String name,String value);
    response.addCookie(cookie);

    cookie的name不可以重復,和Map集合類似,當有重復的name的時候,會替代。

    3、查詢cookie

    //如果沒有 cookie,則返回 null。
    Cookie[] cookies = request.getCookies();
    String name = cookie.getName();
    String value = cookie.getValue();

    4、cookie 保存時的編碼問題

    cookie 的值叧能是ascii 字符,如果是中文,需要將中文轉換成 ascii 字符形式。可以使用 URLEncoder.encode()方法和 URLDecoder.decode()方法來進行這種轉換。

    5、cookie 的保存時間

    cookie.setMaxAge(int seconds);//單位為秒
    ? seconds > 0
    瀏覽器會將 cookie 以文件的方式保存在硬盤上。在超過指定的時間以後,會刪除該文件。
    ? seconds < 0
    默認值,瀏覽器會將 cookie 保存在內存裏面。叧有當瀏覽器關閉以後,才會刪除。
    ? seconds = 0
    立即刪除該 Cookie

    6、刪除 cookie

    比如要刪除一個 name 為”username”的 cookie。
    Cookie c = new Cookie(“username”,”“);
    c.setMaxAge(0);
    cookie.setPath(request.getContextPath());//路徑
    response.addCookie(c);

    7、cookie 的限制

    ? cookie 可以禁止
    ? cookie 的大小有限制(4k 左右)
    ? cookie 的數量也有限制(瀏覽器大約能保存 300 個)
    ? cookie 的值叧能是字符串,要考慮編碼問題。
    ? cookie 不安全

    8、cookie 的路徑問題

    瀏覽器在向服務器上的某個地址發送請求時,會先比較 cookie 的路徑不向訪問的路徑(地址)是否匹配, 叧有匹配的 cookie, 才會發送。
    cookie 的路徑可以通過 cookie.setPath(String path)方法來設置。如果沒有設置, 則有一個缺省的路徑,缺省的路徑是生成該 cookie 的組件的路徑。
    比如: /appname/addCookie 保存了一個 cookie,則該 cookie 的路徑就是/appname/addCookie。
    規則:
    cookie 的路徑必須是要訪問的路徑的上層目錄戒者是不要訪問的路徑相等, 瀏覽器才會將 cookie 發送給服務器。一般可以設置 setPath(“/appname”),表示訪問該應用下的所有地址,均會發送

  23. 服務端如何識別特定的客戶?這個時候Cookie就登場了。每次HTTP請求的時候,客戶端都會發送相應的Cookie信息到服務端。實際上大多數的應用都是用 Cookie 來實現Session跟蹤的,第一次創建Session的時候,服務端會在HTTP協議中告訴客戶端,需要在 Cookie 裏面記錄一個Session ID,以後每次請求把這個會話ID發送到服務器,我就知道你是誰了,註意,第一次請求時,請求頭中是沒有Cookie的,響應頭中會Set-Cookie。 第一次請求時,響應頭中Set-Cookie: 技術分享圖片 Session利用Cookie的實現機制: 技術分享圖片 技術分享圖片 有人問,如果客戶端的瀏覽器禁用了 Cookie 怎麽辦?一般這種情況下,會使用一種叫做URL重寫的技術來進行會話跟蹤,即每次HTTP交互,URL後面都會被附加上一個諸如 jsessionid 這樣的參數,服務端據此來識別用戶。
    <a href="<%=response.encodeURL("getSession.jsp")%>">跳轉到獲取session的頁面</a>
    技術分享圖片 Cookie其實還可以用在一些方便用戶的場景下,設想你某次登陸過一個網站,下次登錄的時候不想再次輸入賬號了,怎麽辦?這個信息可以寫到Cookie裏面,訪問網站的時候,網站頁面的腳本可以讀取這個信息,就自動幫你把用戶名給填了,能夠方便一下用戶。這也是Cookie名稱的由來,給用戶的一點甜頭。 Session是在服務端保存的一個數據結構,用來跟蹤用戶的狀態,這個數據可以保存在集群、數據庫、文件中;
    Cookie是客戶端保存用戶信息的一種機制,用來記錄用戶的一些信息,也是實現Session的一種方式。 Cookie發送: 技術分享圖片
    <%
        Cookie c = new Cookie("name","Gareen");//鍵值對
        c.setMaxAge(60*60*24);//有效期24小時,本地持久化
        c.setPath("127.0.0.1");//Path表示服務器的主機名,只有瀏覽器通過這個主機名訪問服務器的時候,才會提交這個cookie到服務端
        response.addCookie(c);//發送生成的Cookie
    %>
    <a href="getCookie.jsp">跳轉到獲取cookie的頁面</a>
    技術分享圖片

    註意path的問題:

    path表示cookie所在的目錄。”/”表示根目錄,所有頁面都能訪問根目錄下面的cookie。如果cookie的path為test,那麽只test目錄下或者是test下的子目錄的頁面和代碼才獲取到這個cookie。

    例如http://localhost:8080/Web02/test

    當URL的path值是以“/”結尾的時候,直接設置為cookie的path值

    當URL的path值不是以“/”結尾的時候,查看path裏面是否有“/”

    例:http://localhost:8080/Web02/test/testServlet

    如果有“/”的話,直接截取到最後一個“/”,然後設置為cookie的path值。

    如果沒有“/”的話,將cookie的path設置為”/”。

    Cookie讀取

    Cookie[] cookies = request.getCookies();
       if(cookies != null)
         for(int i=0;i<cookies.length;i++){
            response.getWriter().print(cookies[i].getName()+":"+cookies[i].getValue());
         }

    Cookie刪除

    技術分享圖片
    Cookie c = new Cookie("name","peter");
    c.setMaxAge(24*60*60);  
    c.setPath("/");
    response.addCookie(c);
    
    Cookie cookie = new Cookie("username","peter");// 新建Cookie
    cookie.setMaxAge(0);                           // 設置生命周期為0,表示將要刪除
    response.addCookie(cookie);     
    技術分享圖片

2018年5月9日JAVA-servlet02