cookie之增删改查

来源:互联网 发布:苹果数据线线序 编辑:程序博客网 时间:2024/05/16 23:33

前言

前段时间一小伙伴在网上买了部手机,他跟我说了一下手机的型号,我想看看手机的质量,于是在网查询了一下这款手机的信息,之后关掉了网页。但是之后几天每次我打开360浏览器,首页上都会自动弹出该款手机的一些广告信息。一开始还挺好奇浏览器是怎么做到这个的,这也太厉害了。后来想想无非就是服务器在浏览器中存储了我访问那个手机网页的一些信息,而这个信息就是通过cookie来存储的。。。cookie在日常生活或者开发中经常遇到,例如在网上进行购物,就会利用cookie来记录你的浏览记录等等。。。这里总结了一些对于cookie的小细节,如有不足,还请各位指导。

浅说cookie的增删改查

说起cookie,应该先说一说Http的无状态特性,客户端发起一个请求,请求结束之后,这个会话就会关闭,下次同一个人再来访问,相当是再次发送一个新的请求,而cookie就是为了解决这个无状态缺陷的。当以一个请求发送到服务器,服务器会产生响应,而在响应头中设置信息。当浏览器收到信息之后会根据响应头中的信息在浏览器中生成cookie。当一下次再次访问的时候,会带上服务器域名中的这个cookie,或者说这个cookie的作用范围超过该浏览器,在请求这个服务器的时候就会带上cookie。
数据的增删改查,这是日常开发的基础,那么对于cookie的增删改查,又该如何实现呢???
正统的cookie生成时应该在服务器端进行生成的,但是脚本语言像javascript也可以用来生成cookie,本文中的cookie的增删改查主要是针对服务器中的增删改查,首先对于新增一个cookie

/*** @ClassName: TestCookie* @Description: TODO(在服务端设置cookie,返回到浏览器生成cookie)* @author 爱琴孩*/@Controller@RequestMapping("/TestCookie")public class TestCookie {    @RequestMapping("/testCookiePathAndDomain")    public String testCookiePathAndDomain(HttpServletRequest request,HttpServletResponse response){        Cookie cookie=new Cookie("name", "aiqinhai");        cookie.setPath("/");        cookie.setDomain(".aiqinhai.com");        //设置最长有效期是100秒        cookie.setMaxAge(100);        response.addCookie(cookie);        return "login";    }}

上面新增了一个名字为name,值为aiqinhai的cookie,需要注意的是cookie中只能存储Ascii码,不能直接存储汉字。设置了cookie的path为“/”,domain为“.aiqinhai.com”,那么访问以“.aiqinhai.com”为后缀的域名,可以携带上面的cookie。上面设置了cookie的最长有效时间,默认情况下cookie是没有设置最大有效时间的,这时的cookie是会话cookie,会话cookie是存储在内存之中,随着会话的结束cookie也就失效了。当然也可以手动设置cookie的MaxAge为负值,这时和默认cookie是等效的,如果设置MaxAge为0,那么所对应的cookie也会立马删除,如果设置了cookie为正数,那么cookie会保存在磁盘中,等待下一次继续访问,还是能获取到cookie传输到服务器中。
cookie的修改
对于cookie的name,value,path,domain,maxage属性,只是需要调用对应的方法,修改cookie的属性,那么cookie就算是更新了。例如,如果name,value,path,maxage都相同,而修改了domain,那么就可以认为修改了这个cookie。
cookie的删除
对于cookie的删除,刚才在上面已经说过,如下所示,那么这个key为name的cookie就会被删除。这里需要注意的一点是,在删除cookie的时候,cookie的path属性和domain属性需要保持一致,否则就有可能导致想要删除的cookie没有被删除,以前,我遇到过这样的一个问题,我在用户登录之后将用户的用户名保存在cookie之中,在后台生成cookie的时候,我没有显式的给cookie设置path,这时候会以默认路径来设置path,当用户点击退出的时候,我在后台清理cookie。可是我设置了最大超时时间是0,但是浏览器中的cookie依旧存在。当时花费了一点时间,后来弄清楚原来我在删除cookie的时候,也没有设置path,导致系统默认以登录的默认路径设置path,由于两个cookie的path属性不一样,就导致这两个cookie不是同一个cookie,所以登录时保存用户名的cookie在退出的时候始终删除不了。

Cookie cookie=new Cookie("name", null);cookie.setMaxAge(0);

cookie的查询,就是获取cookie中保存的信息

/*** @ClassName: GetCookie* @Description: TODO(获取服务器存放在浏览器中的cookie)* @author 爱琴孩*/@Controller@RequestMapping("/GetCookie")public class GetCookie {    @RequestMapping("/getAllCookies")    public String getAllCookies(HttpServletRequest request,HttpServletResponse response){        Cookie[] cookies=request.getCookies();        for(Cookie cookie :cookies){            System.out.println("cookie中存取的值是"+cookie.getValue());        }        return "login";    }}

以上就是实现了cookie的增删改查
接下来我们来验证一下,cookie是否确实在浏览器生成,还有cookie的跨域名访问能否实现。

验证结果

打开火狐浏览器的firebug,然后在地址栏中输入http://aaa.aiqinhai.com:8080/cookiedemo/TestCookie/testCookiePathAndDomain,可以看到会收到两个cookie,一个是我在后台生成的cookie,一个是tomcat自带的cookie.
这里写图片描述
从上图中可以看出这个两个cookie的domain是不一样的,那么要验证一下”aaa.aiqinhai.com”域名下生成的cookie在”bbb.qiqinhai.com”的域名下能否访问,我们在地址栏中输入地址http://bbb.aiqinhai.com:8080/cookiedemo/GetCookie/getAllCookies,可以看到这个浏览器发送了一个cookie,但是同时也收到了一个cookie.
这里写图片描述
可以看出,这个发送的cookie是在”aaa.aiqinhai.com”域名底下生成的cookie,而收到的cookie是在”bbb.aiqinhai.com”域名下的服务器在浏览器中生成的cookie,这就解释了”aaa.aiqinhai.com”,”bbb.aiqinhai.com”的跨域名访问。我们可以获取”aaa.aiqinhai.com”域名服务器设置在浏览器中cookie中值。

总结

这里的cookie的增删改查已经结束,可能讲解的不是很详细,后续会结合session来继续总结!

原创粉丝点击