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

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

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

    隨筆-71  評(píng)論-4  文章-0  trackbacks-0
    一、 Cookie概述
       Cookie是服務(wù)器發(fā)送給瀏覽器的體積很小的純文本信息,用戶以后訪問(wèn)同一個(gè)Web服務(wù)器時(shí)瀏覽器會(huì)把它們?cè)瓨影l(fā)送給服務(wù)器。通過(guò)讓服務(wù)器讀取它原先保存到客戶端的信息,網(wǎng)站能夠?yàn)闉g覽者提供一系列的方便,例如在線交易過(guò)程中標(biāo)識(shí)用戶身份、安全要求不高的場(chǎng)合避免用戶重復(fù)輸入名字和密碼、門(mén)戶網(wǎng)站的主頁(yè)定制、有針對(duì)性地投放廣告,等等。

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



    二、 Servlet的Cookie API

       要把Cookie發(fā)送到客戶端,Servlet先要調(diào)用new Cookie(name,value)用合適的名字和值創(chuàng)建一個(gè)或多個(gè)Cookie,通過(guò)cookie.setXXX設(shè)置各種屬性,通過(guò)response.addCookie(cookie)把cookie加入應(yīng)答頭。

       要從客戶端讀入Cookie,Servlet應(yīng)該調(diào)用request.getCookies(),getCookies()方法返回一個(gè)Cookie對(duì)象的數(shù)組。在大多數(shù)情況下,你只需要用循環(huán)訪問(wèn)該數(shù)組的各個(gè)元素尋找指定名字的Cookie,然后對(duì)該Cookie調(diào)用getValue方法取得與指定名字關(guān)聯(lián)的值。

    三、 創(chuàng)建Cookie

       調(diào)用Cookie對(duì)象的構(gòu)造函數(shù)可以創(chuàng)建Cookie。Cookie對(duì)象的構(gòu)造函數(shù)有兩個(gè)字符串參數(shù):Cookie名字和Cookie值。名字和值都不能包含空白字符以及下列字符:
    [ ] ( ) = , " / ? @ : ;


    四、 讀取和設(shè)置Cookie屬性

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

    getComment/setComment
         獲取/設(shè)置Cookie的注釋。

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

    getMaxAge/setMaxAge
         獲取/設(shè)置Cookie過(guò)期之前的時(shí)間,以秒計(jì)。如果不設(shè)置該值,則Cookie只在當(dāng)前會(huì)話內(nèi)有效,即在用戶關(guān)閉瀏覽器之前有效,而且這些Cookie不會(huì)保存到磁盤(pán)上。參見(jiàn)下面有關(guān)LongLivedCookie的說(shuō)明。

    getName/setName
         獲取/設(shè)置Cookie的名字。本質(zhì)上,名字和值是我們始終關(guān)心的兩個(gè)部分。由于HttpServletRequest的getCookies方法返回的是一個(gè)Cookie對(duì)象的數(shù)組,因此通常要用循環(huán)來(lái)訪問(wèn)這個(gè)數(shù)組查找特定名字,然后用getValue檢查它的值。

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

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

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

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

    五、 在應(yīng)答頭中設(shè)置Cookie

       Cookie可以通過(guò)HttpServletResponse的addCookie方法加入到Set-Cookie應(yīng)答頭。下面是一個(gè)例子:

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




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

       要把Cookie發(fā)送到客戶端,先要?jiǎng)?chuàng)建Cookie,然后用addCookie發(fā)送一個(gè)Set-Cookie HTTP應(yīng)答頭。這些內(nèi)容已經(jīng)在上面介紹。從客戶端讀取Cookie時(shí)調(diào)用的是HttpServletRequest的getCookies方法。該方法返回一個(gè)與HTTP請(qǐng)求頭中的內(nèi)容對(duì)應(yīng)的Cookie對(duì)象數(shù)組。得到這個(gè)數(shù)組之后,一般是用循環(huán)訪問(wèn)其中的各個(gè)元素,調(diào)用getName檢查各個(gè)Cookie的名字,直至找到目標(biāo)Cookie。然后對(duì)這個(gè)目標(biāo)Cookie調(diào)用getValue,根據(jù)獲得的結(jié)果進(jìn)行其他處理。

       上述處理過(guò)程經(jīng)常會(huì)遇到,為方便計(jì)下面我們提供一個(gè)getCookieValue方法。只要給出Cookie對(duì)象數(shù)組、Cookie名字和默認(rèn)值, getCookieValue方法就會(huì)返回匹配指定名字的Cookie值,如果找不到指定Cookie,則返回默認(rèn)值。

    七、幾個(gè)Cookie工具函數(shù)

       下面是幾個(gè)工具函數(shù)。這些函數(shù)雖然簡(jiǎn)單,但是,在和Cookie打交道的時(shí)候很有用。

       1、 獲取指定名字的Cookie值

       getCookieValue通過(guò)循環(huán)依次訪問(wèn)Cookie對(duì)象數(shù)組的各個(gè)元素,尋找是否有指定名字的Cookie,如找到,則返回該Cookie的值;否則,返回參數(shù)中給出的默認(rèn)值。getCookieValue能夠在一定程度上簡(jiǎn)化 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、自動(dòng)保存的Cookie

       下面是LongLivedCookie類的代碼。如果你希望Cookie能夠在瀏覽器退出的時(shí)候自動(dòng)保存下來(lái),則可以用這個(gè)LongLivedCookie類來(lái)取代標(biāo)準(zhǔn)的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);
       }
    }


    八、實(shí)例:定制的搜索引擎界面

       下面是一個(gè)搜索引擎界面的例子,在這個(gè)Servlet中,用戶界面是動(dòng)態(tài)生成而不是由靜態(tài)HTML文件提供的。Servlet除了負(fù)責(zé)讀取表單數(shù)據(jù)并把它們發(fā)送給搜索引擎之外,還要把包含表單數(shù)據(jù)的Cookie發(fā)送給客戶端。以后客戶再次訪問(wèn)同一表單時(shí),這些 Cookie的值將用來(lái)預(yù)先填充表單,使表單自動(dòng)顯示最近使用過(guò)的數(shù)據(jù)。

       SearchEnginesFrontEnd.java

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

       注意該Servlet用到了ServletUtilities.java,其中g(shù)etCookieValue前面已經(jīng)介紹過(guò),headWithTitle 用于生成HTML頁(yè)面的一部分。另外,這里也用到了前面已經(jīng)說(shuō)明的LongLiveCookie類,我們用它來(lái)創(chuàng)建作廢期限很長(zhǎng)的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把數(shù)據(jù)發(fā)送到CustomizedSearchEngines Servlet,下面例子除了要構(gòu)造一個(gè)針對(duì)搜索引擎的URL并向用戶發(fā)送一個(gè)重定向應(yīng)答之外,還要發(fā)送保存用戶數(shù)據(jù)的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);
    
    
      //這里用這個(gè)url代替了google搜索
     response.sendRedirect(url);
       
     
    }
    
    } 
    
    

    這個(gè)應(yīng)用的運(yùn)行圖:(用戶的輸入數(shù)據(jù)瀏覽器下次啟動(dòng)時(shí)將會(huì)保留)


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

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲v高清理论电影| 114一级毛片免费| h片在线观看免费| 瑟瑟网站免费网站入口| 美女露隐私全部免费直播| 亚洲精品自偷自拍无码| 亚洲精品乱码久久久久久V| 亚洲精品无码久久久久秋霞| 亚洲日韩国产一区二区三区在线 | 免费黄色小视频网站| 成人毛片免费在线观看| 午夜高清免费在线观看| 国产麻豆剧传媒精品国产免费| 日本免费观看网站| 男人的天堂亚洲一区二区三区 | 亚洲中文字幕在线乱码| 国产成人综合亚洲AV第一页 | 免费国产在线观看不卡| 亚洲AⅤ视频一区二区三区 | 1000部夫妻午夜免费| 2021久久精品免费观看| 免费毛片网站在线观看| 免费又黄又爽又猛的毛片| 亚洲精品国产高清嫩草影院| 亚洲伊人久久精品影院| 亚洲AV无码AV男人的天堂| 亚洲精品成人久久| 亚洲日本成本人观看| 免费观看四虎精品成人| 国色精品va在线观看免费视频 | 免费人人潮人人爽一区二区| 国产男女爽爽爽免费视频| 无码日韩精品一区二区三区免费 | 67194熟妇在线永久免费观看| 永久免费av无码网站大全| 亚洲欧洲精品成人久久奇米网| 久久精品国产亚洲AV麻豆不卡| 亚洲a视频在线观看| 国产区图片区小说区亚洲区| a毛片视频免费观看影院| 日韩亚洲国产高清免费视频|