个人音乐类网站服务器租借,重庆网上房地产查询,百度搜索排行,网站建设站长1 Cookie概述
1.1 什么叫Cookie Cookie翻译成中文是小甜点#xff0c;小饼干的意思。在HTTP中它表示服务器送给客户端浏览器的小甜点。其实Cookie就是一个键和一个值构成的#xff0c;随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来#xff…1 Cookie概述
1.1 什么叫Cookie Cookie翻译成中文是小甜点小饼干的意思。在HTTP中它表示服务器送给客户端浏览器的小甜点。其实Cookie就是一个键和一个值构成的随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来当下一次再访问服务器时把Cookie再发送给服务器。 Cookie是由服务器创建然后通过响应发送给客户端的一个键值对。客户端会保存Cookie并会标注出Cookie的来源哪个服务器的Cookie。当客户端向服务器发出请求时会把所有这个服务器Cookie包含在请求中发送给服务器这样服务器就可以识别客户端了 1.2 Cookie规范 Cookie大小上限为4KB 一个服务器最多在客户端浏览器上保存20个Cookie 一个浏览器最多保存300个Cookie 上面的数据只是HTTP的Cookie规范但在浏览器大战的今天一些浏览器为了打败对手为了展现自己的能力起见可能对Cookie规范“扩展”了一些例如每个Cookie的大小为8KB最多可保存500个Cookie等但也不会出现把你硬盘占满的可能 注意不同浏览器之间是不共享Cookie的。也就是说在你使用IE访问服务器时服务器会把Cookie发给IE然后由IE保存起来当你在使用FireFox访问服务器时不可能把IE保存的Cookie发送给服务器。 1.3 Cookie与HTTP头 Cookie是通过HTTP请求和响应头在客户端和服务器端传递的 Cookie请求头客户端发送给服务器端 Ø 格式Cookie: aA; bB; cC。即多个Cookie用分号离开 Set-Cookie响应头服务器端发送给客户端 Ø 一个Cookie对象一个Set-Cookie Set-Cookie: aA Set-Cookie: bB Set-Cookie: cC 1.4 Cookie的覆盖 如果服务器端发送重复的Cookie那么会覆盖原有的Cookie例如客户端的第一个请求服务器端发送的Cookie是Set-Cookie: aA第二请求服务器端发送的是Set-Cookie:aAA那么客户端只留下一个Cookie即aAA。 1.5 Cookie案例 我们这个案例是客户端访问AServletAServlet在响应中添加Cookie浏览器会自动保存Cookie。然后客户端访问BServlet这时浏览器会自动在请求中带上CookieBServlet获取请求中的Cookie打印出来。 AServlet.java package cn.itcast.servlet; import java.io.IOException; import java.util.UUID; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 给客户端发送Cookie * author Administrator * */ public class AServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType(text/html;charsetutf-8); String id UUID.randomUUID().toString();//生成一个随机字符串 Cookie cookie new Cookie(id, id);//创建Cookie对象指定名字和值 response.addCookie(cookie);//在响应中添加Cookie对象 response.getWriter().print(已经给你发送了ID); } } BServlet.java package cn.itcast.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 获取客户端请求中的Cookie * author Administrator * */ public class BServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType(text/html;charsetutf-8); Cookie[] cs request.getCookies();//获取请求中的Cookie if(cs ! null) {//如果请求中存在Cookie for(Cookie c : cs) {//遍历所有Cookie if(c.getName().equals(id)) {//获取Cookie名字如果Cookie名字是id response.getWriter().print(您的ID是 c.getValue());//打印Cookie值 } } } } } 2 Cookie的生命
2.1 什么是Cookie的生命 Cookie不只是有name和valueCookie还是生命。所谓生命就是Cookie在客户端的有效时间可以通过setMaxAge(int)来设置Cookie的有效时间。 cookie.setMaxAge(-1)cookie的maxAge属性的默认值就是-1表示只在浏览器内存中存活。一旦关闭浏览器窗口那么cookie就会消失。 cookie.setMaxAge(60*60)表示cookie对象可存活1小时。当生命大于0时浏览器会把Cookie保存到硬盘上就算关闭浏览器就算重启客户端电脑cookie也会存活1小时 cookie.setMaxAge(0)cookie生命等于0是一个特殊的值它表示cookie被作废也就是说如果原来浏览器已经保存了这个Cookie那么可以通过Cookie的setMaxAge(0)来删除这个Cookie。无论是在浏览器内存中还是在客户端硬盘上都会删除这个Cookie。
2.2 案例显示上次访问时间 创建Cookie名为lasttime值为当前时间添加到response中 在AServlet中获取请求中名为lasttime的Cookie 如果不存在输出“您是第一次访问本站”如果存在输出“您上一次访问本站的时间是xxx”
AServlet.java public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType(text/html;charsetutf-8); Cookie cookie new Cookie(lasttime, new Date().toString()); cookie.setMaxAge(60 * 60); response.addCookie(cookie); Cookie[] cs request.getCookies(); String s 您是首次访问本站; if(cs ! null) { for(Cookie c : cs) { if(c.getName().equals(lasttime)) { s 您上次的访问时间是 c.getValue(); } } } response.getWriter().print(s); } 3 Cookie的path
3.1 什么是Cookie的路径 现在有WEB应用A向客户端发送了10个Cookie这就说明客户端无论访问应用A的哪个Servlet都会把这10个Cookie包含在请求中但是也许只有AServlet需要读取请求中的Cookie而其他Servlet根本就不会获取请求中的Cookie。这说明客户端浏览器有时发送这些Cookie是多余的 可以通过设置Cookie的path来指定浏览器在访问什么样的路径时包含什么样的Cookie。
3.2 Cookie路径与请求路径的关系 下面我们来看看Cookie路径的作用 下面是客户端浏览器保存的3个Cookie的路径 a: /cookietest b: /cookietest/servlet c: /cookietest/jsp 下面是浏览器请求的URL A: http://localhost:8080/cookietest/AServlet B: http://localhost:8080/cookietest/servlet/BServlet C: http://localhost:8080/cookietest/servlet/CServlet 请求A时会在请求中包含a 请求B时会在请求中包含a、b 请求C时会在请求中包含a、c 也就是说请求路径如果包含了Cookie路径那么会在请求中包含这个Cookie否则不会请求中不会包含这个Cookie。 A请求的URL包含了“/cookietest”所以会在请求中包含路径为“/cookietest”的Cookie B请求的URL包含了“/cookietest”以及“/cookietest/servlet”所以请求中包含路径为“/cookietest”和“/cookietest/servlet”两个Cookie C请求的URL包含了“/cookietest”以及“/cookietest/jsp”所以请求中包含路径为“/cookietest”和“/cookietest/jsp”两个Cookie 3.3 设置Cookie的路径 设置Cookie的路径需要使用setPath()方法例如 cookie.setPath(“/cookietest/servlet”); 如果没有设置Cookie的路径那么Cookie路径的默认值当前访问资源所在路径例如 访问http://localhost:8080/cookietest/AServlet时添加的Cookie默认路径为/cookietest 访问http://localhost:8080/cookietest/servlet/BServlet时添加的Cookie默认路径为/cookietest/servlet 访问http://localhost:8080/cookietest/jsp/BServlet时添加的Cookie默认路径为/cookietest/jsp 4 Cookie的domain Cookie的domain属性可以让网站中二级域共享Cookie次要 百度你是了解的对吧 http://www.baidu.com http://zhidao.baidu.com http://news.baidu.com http://tieba.baidu.com 现在我希望在这些主机之间共享Cookie例如在www.baidu.com中响应的cookie可以在news.baidu.com请求中包含。很明显现在不是路径的问题了而是主机的问题即域名的问题。处理这一问题其实很简单只需要下面两步 设置Cookie的path为“/”c.setPath(“/”) 设置Cookie的domain为“.baidu.com”c.setDomain(“.baidu.com”)。 当domain为“.baidu.com”时无论前缀是什么都会共享Cookie的。但是现在我们需要设置两个虚拟主机www.baidu.com和news.baidu.com。 第一步设置windows的DNS路径解析
找到C:\WINDOWS\system32\drivers\etc\hosts文件添加如下内容 127.0.0.1 localhost 127.0.0.1 www.baidu.com 127.0.0.1 news.baidu.com 第二步设置Tomcat虚拟主机
找到server.xml文件添加Host元素内容如下 Host namewww.baidu.com appBaseF:\webapps\www unpackWARstrue autoDeploytrue xmlValidationfalse xmlNamespaceAwarefalse/ Host namenews.baidu.com appBaseF:\webapps\news unpackWARstrue autoDeploytrue xmlValidationfalse xmlNamespaceAwarefalse/ 第三步创建A项目创建AServlet设置Cookie。 Cookie c new Cookie(id, baidu); c.setPath(/); c.setDomain(.baidu.com); c.setMaxAge(60*60); response.addCookie(c); response.getWriter().print(OK); 把A项目的WebRoot目录复制到F:\webapps\www目录下并把WebRoot目录的名字修改为ROOT。 第四步创建B项目创建BServlet获取Cookie并打印出来。 Cookie[]cs request.getCookies(); if(cs ! null) { for(Cookie c : cs) { String s c.getName() : c.getValue() br/; response.getWriter().print(s); } } 把B项目的WebRoot目录复制到F:\webapps\news目录下并把WebRoot目录的名字修改为ROOT。 第五步访问www.baidu.com\AServlet然后再访问news.baidu.com\BServlet。 5 Cookie中保存中文
Cookie的name和value都不能使用中文如果希望在Cookie中使用中文那么需要先对中文进行URL编码然后把编码后的字符串放到Cookie中。 向客户端响应中添加Cookie String name URLEncoder.encode(姓名, UTF-8); String value URLEncoder.encode(张三, UTF-8); Cookie c new Cookie(name, value); c.setMaxAge(3600); response.addCookie(c); 从客户端请求中获取Cookie response.setContentType(text/html;charsetutf-8); Cookie[] cs request.getCookies(); if(cs ! null) { for(Cookie c : cs) { String name URLDecoder.decode(c.getName(), UTF-8); String value URLDecoder.decode(c.getValue(), UTF-8); String s name : value br/; response.getWriter().print(s); } }