cookie:处理Cookie来源: 发布时间:星期四, 2009年2月12日 浏览:59次 评论:0
Cookie概述 Cookie是服务器发送给浏览器体积很小纯文本信息用户以后访问同个Web服务器时浏览器会把它们原样发送给服务器通过让服务器读取它原先保存到客户端信息网站WebSite能够为浏览者提供系列方便例如在线交易过程中标识用户身份、安全要求不高场合避免用户重复输入名字和密码、门户网站WebSite主页定制、有针对性地投放广告等等 Cookie目就是为用户带来方便为网站WebSite带来增值虽然有着许多误传事实上Cookie并不会造成严重安全威胁Cookie永远不会以任何方式执行因此也不会带来病毒或攻击你系统另外由于浏览器般只允许存放300个Cookie每个站点最多存放20个Cookie每个Cookie大小限制为4KB因此Cookie不会塞满你硬盘更不会被用作“拒绝服务”攻击手段 9.2ServletCookieAPI 要把Cookie发送到客户端Servlet先要Cookie(name,value)用合适名字和值创建个或多个Cookie(2.1节)通过cookie.XXX设置各种属性(2.2节)通过response.addCookie(cookie)把cookie加入应答头(2.3节) 要从客户端读入CookieServlet应该request.getCookiesgetCookies思路方法返回个Cookie对象在大多数情况下你只需要用循环访问该各个元素寻找指定名字Cookie然后对该CookiegetValue思路方法取得和指定名字关联值这部分内容将在2.4节讨论 9.2.1创建Cookie Cookie对象构造可以创建CookieCookie对象构造有两个串参数:Cookie名字和Cookie值名字和值都不能包含空白以及下列: =,"/?@:; 9.2.2读取和设置Cookie属性 把Cookie加入待发送应答头的前你可以查看或设置Cookie各种属性下面摘要介绍这些思路方法: getComment/Comment 获取/设置Cookie注释 getDo/Do 获取/设置Cookie适用域般地Cookie只返回给和发送它服务器名字完全相同服务器使用这里思路方法可以指示浏览器把Cookie返回给同域内其他服务器注意域必须以点开始(例如.sitename.com)非国家类域(如.com.edu.gov)必须包含两个点国家类域(如.com.cn.edu.uk)必须包含 3个点 getMaxAge/MaxAge 获取/设置Cookie过期的前时间以秒计如果不设置该值则Cookie只在当前会话内有效即在用户关闭浏览器的前有效而且这些Cookie不会保存到磁盘上参见下面有关LongLivedCookie介绍说明 getName/Name 获取/设置Cookie名字本质上名字和值是我们始终关心两个部分由于HttpServletRequestgetCookies思路方法返回是个Cookie对象因此通常要用循环来访问这个查找特定名字然后用getValue检查它值 getPath/Path 获取/设置Cookie适用路径如果不指定路径Cookie将返回给当前页面所在目录及其子目录下所有页面这里思路方法可以用来设定些更般条件例如someCookie.Path("/")此时服务器上所有页面都可以接收到该Cookie getSecure/Secure 获取/设置个boolean值该值表示是否Cookie只能通过加密连接(即SSL)发送 getValue/Value 获取/设置Cookie值如前所述名字和值实际上是我们始终关心两个方面不过也有些例外情况比如把名字作为逻辑标记(也就是说如果名字存在则表示true) getVersion/Version 获取/设置Cookie所遵从协议版本默认版本0(遵从原先Netscape规范标准);版本1遵从RFC2109但尚未得到广泛支持 9.2.3在应答头中设置Cookie Cookie可以通过HttpServletResponseaddCookie思路方法加入到Set-Cookie应答头下面是个例子: CookieuserCookie=Cookie("user","uid1234"); response.addCookie(userCookie); 9.2.4读取保存到客户端Cookie 要把Cookie发送到客户端先要创建Cookie然后用addCookie发送个Set-CookieHTTP应答头这些内容已经在上面2.1节介绍从客户端读取Cookie时是HttpServletRequestgetCookies思路方法该思路方法返回个和HTTP请求头中内容对应Cookie对象得到这个的后般是用循环访问其中各个元素getName检查各个Cookie名字直至找到目标Cookie然后对这个目标CookiegetValue根据获得结果进行其他处理 上述处理过程经常会遇到为方便计下面我们提供个getCookieValue思路方法只要给出Cookie对象、Cookie名字和默认值getCookieValue思路方法就会返回匹配指定名字Cookie值如果找不到指定Cookie则返回默认值 9.3几个Cookie工具 下面是几个工具这些虽然简单但是在和Cookie打交道时候很有用 9.3.1获取指定名字Cookie值 该是ServletUtilities.java部分getCookieValue通过循环依次访问Cookie对象各个元素寻找是否有指定名字Cookie如找到则返回该Cookie值;否则返回参数中给出默认值getCookieValue能够在定程度上简化Cookie值提取 publicStringgetCookieValue(Cookiecookies, StringcookieName, StringdefaultValue){ for(i=0;i<cookies.length;i){ Cookiecookie=cookies[i]; (cookieName.equals(cookie.getName)) (cookie.getValue); } (defaultValue); } 9.3.2自动保存Cookie 下面是LongLivedCookie类代码如果你希望Cookie能够在浏览器退出时候自动保存下来则可以用这个LongLivedCookie类来取代标准Cookie类 packagehall; importjavax.servlet.http.*; publicLongLivedCookieextendsCookie{ publicfinalSECONDS_PER_YEAR=60*60*24*365; publicLongLivedCookie(Stringname,Stringvalue){ super(name,value); MaxAge(SECONDS_PER_YEAR); } } 9.4.例子:定制搜索引擎界面 下面也是个搜索引擎界面例子通过修改前面HTTP状态代码例子得到在这个Servlet中用户界面是动态生成而不是由静态HTML文件提供Servlet除了负责读取表单数据并把它们发送给搜索引擎的外还要把包含表单数据Cookie发送给客户端以后客户再次访问同表单时这些Cookie值将用来预先填充表单使表单自动显示最近使用过数据 SearchEnginesFrontEnd.java 该Servlet构造个主要由表单构成用户界面第次显示时候它和前面用静态HTML页面提供界面差不多然而用户选择值将被保存到Cookie(本页面将数据发送到CustomizedSearchEnginesServlet由后者设置Cookie)用户以后再访问同页面时即使浏览器是退出的后再启动表单中也会自动填好上次搜索所填写内容 注意该Servlet用到了ServletUtilities.java其中getCookieValue前面已经介绍过headWithTitle用于生成HTML页面部分另外这里也用到了前面已经介绍说明LongLiveCookie类我们用它来创建作废期限很长Cookie packagehall; importjava.io.*; importjavax.servlet.*; importjavax.servlet.http.*; importjava.net.*; publicSearchEnginesFrontEndextendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest, HttpServletResponseresponse) throwsServletException,IOException{ Cookiecookies=request.getCookies; StringsearchString= ServletUtilities.getCookieValue(cookies, "searchString", "JavaProgramming"); StringnumResults= ServletUtilities.getCookieValue(cookies, "numResults", "10"); StringsearchEngine= ServletUtilities.getCookieValue(cookies, "searchEngine", "google"); response.ContentType("text/html"); PrWriterout=response.getWriter; Stringtitle="SearchingtheWeb"; out.prln(ServletUtilities.headWithTitle(title)+ "<BODYBGCOLOR=\"#FDF5E6\">\n"+ "<H1ALIGN=\"CENTER\">SearchingtheWeb</H1>\n"+ "\n"+ "<FORMACTION=\"/servlet/hall.CustomizedSearchEngines\">\n"+ "<CENTER>\n"+ "SearchString:\n"+ "<INPUTTYPE=\"TEXT\"NAME=\"searchString\"\n"+ "VALUE=\""+searchString+"\"> \n"+ "ResultstoShowPerPage:\n"+ "<INPUTTYPE=\"TEXT\"NAME=\"numResults\"\n"+ "VALUE="+numResults+"SIZE=3> \n"+ "<INPUTTYPE=\"RADIO\"NAME=\"searchEngine\"\n"+ "VALUE=\"google\""+ checked("google",searchEngine)+">\n"+ "Google|\n"+ "<INPUTTYPE=\"RADIO\"NAME=\"searchEngine\"\n"+ "VALUE=\"infoseek\""+ checked("infoseek",searchEngine)+">\n"+ "Infoseek|\n"+ "<INPUTTYPE=\"RADIO\"NAME=\"searchEngine\"\n"+ "VALUE=\"lycos\""+ checked("lycos",searchEngine)+">\n"+ "Lycos|\n"+ "<INPUTTYPE=\"RADIO\"NAME=\"searchEngine\"\n"+ "VALUE=\"hotbot\""+ checked("hotbot",searchEngine)+">\n"+ "HotBot\n"+ " \n"+ "<INPUTTYPE=\"SUBMIT\"VALUE=\"Search\">\n"+ "</CENTER>\n"+ "</FORM>\n"+ "\n"+ "</BODY>\n"+ "</HTML>\n"); } privateStringchecked(Stringname1,Stringname2){ (name1.equals(name2)) ("CHECKED"); (""); } } CustomizedSearchEngines.java 前面SearchEnginesFrontEndServlet把数据发送到CustomizedSearchEnginesServlet本例在许多方面和前面介绍HTTP状态代码时例子相似区别在于本例除了要构造个针对搜索引擎URL并向用户发送个重定向应答的外还要发送保存用户数据Cookies packagehall; importjava.io.*; importjavax.servlet.*; importjavax.servlet.http.*; importjava.net.*; publicCustomizedSearchEnginesextendsHttpServlet{ publicvoiddoGet(HttpServletRequestrequest, HttpServletResponseresponse) throwsServletException,IOException{ StringsearchString=request.getParameter("searchString"); CookiesearchStringCookie= LongLivedCookie("searchString",searchString); response.addCookie(searchStringCookie); searchString=URLEncoder.encode(searchString); StringnumResults=request.getParameter("numResults"); CookienumResultsCookie= LongLivedCookie("numResults",numResults); response.addCookie(numResultsCookie); StringsearchEngine=request.getParameter("searchEngine"); CookiesearchEngineCookie= LongLivedCookie("searchEngine",searchEngine); response.addCookie(searchEngineCookie); SearchSpeccommonSpecs=SearchSpec.getCommonSpecs; for(i=0;i<commonSpecs.length;i){ SearchSpecsearchSpec=commonSpecs[i]; (searchSpec.getName.equals(searchEngine)){ Stringurl= searchSpec.makeURL(searchString,numResults); response.sendRedirect(url); ; } } response.sendError(response.SC_NOT_FOUND, "Norecognizedsearchenginespecied."); } publicvoiddoPost(HttpServletRequestrequest, HttpServletResponseresponse) throwsServletException,IOException{ doGet(request,response); } } 0
相关文章读者评论发表评论 |