<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-71  評論-4  文章-0  trackbacks-0
    一、 Cookie概述
       Cookie是服務器發送給瀏覽器的體積很小的純文本信息,用戶以后訪問同一個Web服務器時瀏覽器會把它們原樣發送給服務器。通過讓服務器讀取它原先保存到客戶端的信息,網站能夠為瀏覽者提供一系列的方便,例如在線交易過程中標識用戶身份、安全要求不高的場合避免用戶重復輸入名字和密碼、門戶網站的主頁定制、有針對性地投放廣告,等等。

       Cookie的目的就是為用戶帶來方便,為網站帶來增值。雖然有著許多誤傳,事實上Cookie并不會造成嚴重的安全威脅。Cookie永遠不會以任何方式執行,因此也不會帶來病毒或攻擊你的系統。另外,由于瀏覽器一般只允許存放300個Cookie,每個站點最多存放20個Cookie,每個 Cookie的大小限制為4 KB,因此Cookie不會塞滿你的硬盤,更不會被用作“拒絕服務”攻擊手段。



    二、 Servlet的Cookie API

       要把Cookie發送到客戶端,Servlet先要調用new Cookie(name,value)用合適的名字和值創建一個或多個Cookie,通過cookie.setXXX設置各種屬性,通過response.addCookie(cookie)把cookie加入應答頭。

       要從客戶端讀入Cookie,Servlet應該調用request.getCookies(),getCookies()方法返回一個Cookie對象的數組。在大多數情況下,你只需要用循環訪問該數組的各個元素尋找指定名字的Cookie,然后對該Cookie調用getValue方法取得與指定名字關聯的值。

    三、 創建Cookie

       調用Cookie對象的構造函數可以創建Cookie。Cookie對象的構造函數有兩個字符串參數:Cookie名字和Cookie值。名字和值都不能包含空白字符以及下列字符:
    [ ] ( ) = , " / ? @ : ;


    四、 讀取和設置Cookie屬性

       把Cookie加入待發送的應答頭之前,你可以查看或設置Cookie的各種屬性。下面摘要介紹這些方法:

    getComment/setComment
         獲取/設置Cookie的注釋。

    getDomain/setDomain
         獲取/設置Cookie適用的域。一般地,Cookie只返回給與發送它的服務器名字完全相同的服務器。使用這里的方法可以指示瀏覽器把Cookie返回給同一域內的其他服務器。注意域必須以點開始(例如.sitename.com),非國家類的域(如.com,.edu,.gov)必須包含兩個點,國家類的域(如.com.cn,.edu.uk)必須包含三個點。

    getMaxAge/setMaxAge
         獲取/設置Cookie過期之前的時間,以秒計。如果不設置該值,則Cookie只在當前會話內有效,即在用戶關閉瀏覽器之前有效,而且這些Cookie不會保存到磁盤上。參見下面有關LongLivedCookie的說明。

    getName/setName
         獲取/設置Cookie的名字。本質上,名字和值是我們始終關心的兩個部分。由于HttpServletRequest的getCookies方法返回的是一個Cookie對象的數組,因此通常要用循環來訪問這個數組查找特定名字,然后用getValue檢查它的值。

    getPath/setPath
         獲取/設置Cookie適用的路徑。如果不指定路徑,Cookie將返回給當前頁面所在目錄及其子目錄下的所有頁面。這里的方法可以用來設定一些更一般的條件。例如,someCookie.setPath("/"),此時服務器上的所有頁面都可以接收到該Cookie。

    getSecure/setSecure
        獲取/設置一個boolean值,該值表示是否Cookie只能通過加密的連接(即SSL)發送。

    getValue/setValue
        獲取/設置Cookie的值。如前所述,名字和值實際上是我們始終關心的兩個方面。不過也有一些例外情況,比如把名字作為邏輯標記(也就是說,如果名字存在,則表示true)。

    getVersion/setVersion
         獲取/設置Cookie所遵從的協議版本。默認版本0(遵從原先的Netscape規范);版本1遵從RFC 2109 , 但尚未得到廣泛的支持。

    五、 在應答頭中設置Cookie

       Cookie可以通過HttpServletResponse的addCookie方法加入到Set-Cookie應答頭。下面是一個例子:

    Cookie userCookie = new Cookie("user", "uid1234");
    response.addCookie(userCookie);




    六、 讀取保存到客戶端的Cookie

       要把Cookie發送到客戶端,先要創建Cookie,然后用addCookie發送一個Set-Cookie HTTP應答頭。這些內容已經在上面介紹。從客戶端讀取Cookie時調用的是HttpServletRequest的getCookies方法。該方法返回一個與HTTP請求頭中的內容對應的Cookie對象數組。得到這個數組之后,一般是用循環訪問其中的各個元素,調用getName檢查各個Cookie的名字,直至找到目標Cookie。然后對這個目標Cookie調用getValue,根據獲得的結果進行其他處理。

       上述處理過程經常會遇到,為方便計下面我們提供一個getCookieValue方法。只要給出Cookie對象數組、Cookie名字和默認值, getCookieValue方法就會返回匹配指定名字的Cookie值,如果找不到指定Cookie,則返回默認值。

    七、幾個Cookie工具函數

       下面是幾個工具函數。這些函數雖然簡單,但是,在和Cookie打交道的時候很有用。

       1、 獲取指定名字的Cookie值

       getCookieValue通過循環依次訪問Cookie對象數組的各個元素,尋找是否有指定名字的Cookie,如找到,則返回該Cookie的值;否則,返回參數中給出的默認值。getCookieValue能夠在一定程度上簡化 Cookie值的提取。

    public static String getCookieValue(Cookie[] cookies, String cookieName, String defaultValue) {
       for(int i=0; i<cookies.length; i++) {
         Cookie cookie = cookies[i];
         if (cookieName.equals(cookie.getName()))
           return(cookie.getValue());
        }
        return(defaultValue);
    }




       2、自動保存的Cookie

       下面是LongLivedCookie類的代碼。如果你希望Cookie能夠在瀏覽器退出的時候自動保存下來,則可以用這個LongLivedCookie類來取代標準的Cookie類。

    package hall;
    import javax.servlet.http.*;

    public class LongLivedCookie extends Cookie {
       public static final int SECONDS_PER_YEAR = 60*60*24*365;
       public LongLivedCookie(String name, String value) {
         super(name, value);
         setMaxAge(SECONDS_PER_YEAR);
       }
    }


    八、實例:定制的搜索引擎界面

       下面是一個搜索引擎界面的例子,在這個Servlet中,用戶界面是動態生成而不是由靜態HTML文件提供的。Servlet除了負責讀取表單數據并把它們發送給搜索引擎之外,還要把包含表單數據的Cookie發送給客戶端。以后客戶再次訪問同一表單時,這些 Cookie的值將用來預先填充表單,使表單自動顯示最近使用過的數據。

       SearchEnginesFrontEnd.java

       該Servlet構造一個主要由表單構成的用戶界面。第一次顯示的時候,它和靜態HTML頁面提供的界面差不多。然而,用戶選擇的值將被保存到 Cookie(本頁面將數據發送到CustomizedSearchEngines Servlet,由后者設置Cookie)。用戶以后再訪問同一頁面時,即使瀏覽器是退出之后再啟動,表單中也會自動填好上一次搜索所填寫的內容。

       注意該Servlet用到了ServletUtilities.java,其中getCookieValue前面已經介紹過,headWithTitle 用于生成HTML頁面的一部分。另外,這里也用到了前面已經說明的LongLiveCookie類,我們用它來創建作廢期限很長的Cookie。
    package hall;

    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.net.*;

    public class SearchEnginesFrontEnd extends HttpServlet {
      public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Cookie[] cookies = request.getCookies();
        String searchString =getCookieValue(cookies, "searchString", "Java Programming");
        String numResults = getCookieValue(cookies, "numResults", "10");
        String searchEngine =getCookieValue(cookies, "searchEngine", "google");
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        String title = "Searching the Web";
        out.println("<BODY BGCOLOR=\"#FDF5E6\">\n" +
          "<H1 ALIGN=\"CENTER\">Searching the Web</H1>\n" +
          "\n" +
          "<FORM ACTION=\"/servlet/hall.CustomizedSearchEngines\">\n" +
          "<CENTER>\n" +
          "Search String:\n" +
          "<INPUT TYPE=\"TEXT\" NAME=\"searchString\"\n" +
          " VALUE=\"" + searchString + "\"><BR>\n" +
          "Results to Show Per Page:\n" +
          "<INPUT TYPE=\"TEXT\" NAME=\"numResults\"\n" +
          " VALUE=" + numResults + " SIZE=3><BR>\n" +
          "<INPUT TYPE=\"RADIO\" NAME=\"searchEngine\"\n" +
          " VALUE=\"google\"" +
          checked("google", searchEngine) + ">\n" +
          "Google |\n" +
          "<INPUT TYPE=\"RADIO\" NAME=\"searchEngine\"\n" +
          " VALUE=\"infoseek\"" +
          checked("infoseek", searchEngine) + ">\n" +
          "Infoseek |\n" +
          "<INPUT TYPE=\"RADIO\" NAME=\"searchEngine\"\n" +
          " VALUE=\"lycos\"" +
           checked("lycos", searchEngine) + ">\n" +
          "Lycos |\n" +
          "<INPUT TYPE=\"RADIO\" NAME=\"searchEngine\"\n" +
          " VALUE=\"hotbot\"" +
          checked("hotbot", searchEngine) + ">\n" +
          "HotBot\n" +
          "<BR>\n" +
          "<INPUT TYPE=\"SUBMIT\" VALUE=\"Search\">\n" +
          "</CENTER>\n" +
          "</FORM>\n" +
          "\n" +
          "</BODY>\n" +
          "</HTML>\n");
        }

        private String checked(String name1, String name2) {
           if (name1.equals(name2))
               return(" CHECKED");
           else
               return("");
        }

     public String getCookieValue(Cookie[] cookies, String cookieName, String defaultValue) {
       for(int i=0; i<cookies.length; i++) {
         Cookie cookie = cookies[i];
         if (cookieName.equals(cookie.getName()))
           return(cookie.getValue());
        }
        return(defaultValue);
    }


    }




       CustomizedSearchEngines.java

       前面的SearchEnginesFrontEnd Servlet把數據發送到CustomizedSearchEngines Servlet,下面例子除了要構造一個針對搜索引擎的URL并向用戶發送一個重定向應答之外,還要發送保存用戶數據的Cookies。

    package hall;
    
    import java.io.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import java.net.*;
    
    public class CustomizedSearchEngines extends HttpServlet {
     public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException{
    
      String searchString = request.getParameter("searchString");
      Cookie searchStringCookie =new LongLivedCookie("searchString", searchString);
      response.addCookie(searchStringCookie);
      //searchString = URLEncoder.encode(searchString);
    
      String numResults = request.getParameter("numResults");
      Cookie numResultsCookie =new LongLivedCookie("numResults", numResults);
      response.addCookie(numResultsCookie);
      String searchEngine = request.getParameter("searchEngine");
      Cookie searchEngineCookie =new LongLivedCookie("searchEngine", searchEngine);
      response.addCookie(searchEngineCookie);
      String url=request.getContextPath()+"/index.jsp";
                url=response.encodeRedirectURL(url);
    
    
      //這里用這個url代替了google搜索
     response.sendRedirect(url);
       
     
    }
    
    } 
    
    

    這個應用的運行圖:(用戶的輸入數據瀏覽器下次啟動時將會保留)


    posted on 2006-01-12 12:25 zjw_albert 閱讀(102) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲尹人九九大色香蕉网站 | 一本色道久久综合亚洲精品蜜桃冫 | 免费人成视频在线观看网站| 中文字幕在亚洲第一在线 | 中文字幕无码亚洲欧洲日韩| 国国内清清草原免费视频99 | **实干一级毛片aa免费| 青青草原精品国产亚洲av| 四虎影视在线影院在线观看免费视频| 色妞WWW精品免费视频| 亚洲成亚洲乱码一二三四区软件| 亚洲精品无码国产片| 暖暖免费高清日本中文| 国产亚洲男人的天堂在线观看| 亚洲免费二区三区| 久久综合久久综合亚洲| 国产成人免费a在线资源| 深夜a级毛片免费视频| 狠狠色婷婷狠狠狠亚洲综合 | 亚洲伊人久久大香线蕉在观| 中文字幕影片免费在线观看| 国产亚洲玖玖玖在线观看| 日韩免费观看的一级毛片| 有色视频在线观看免费高清在线直播| 国产亚洲精午夜久久久久久| 国产成人无码区免费内射一片色欲| 亚洲AV成人精品网站在线播放| 国产精品亚洲专区在线播放| 亚洲精品A在线观看| 色一情一乱一伦一视频免费看| 亚洲日韩在线第一页| 边摸边吃奶边做爽免费视频99| 国产成人亚洲精品91专区手机| 青青操视频在线免费观看| 亚洲精品一区二区三区四区乱码| 久久精品网站免费观看| 一级做a爰性色毛片免费| 中文字幕亚洲综合久久菠萝蜜| 男人的天堂网免费网站| 亚洲国产视频久久| 综合亚洲伊人午夜网 |