要说Cookie是怎么来的,先来说说Http请求的特点
Http协议是无连接的,意思是说当我们的浏览器请求服务器的一个页面时,一旦请求完成,服务器作出响应,客户端浏览器拿到这个页面的内容,立即断开连接,说白了就是Socket关闭了,浏览器和服务器之间就没有连接了。
那有个问题比如,我们上京东买本书,在还未登陆的情况下(避免与Session冲突),通常情况是在一个页面点击购买或加入购物车,点击结账会跳到另一个页面,另一个页面会显示我们购买的书。
既然Http协议是无连接的,当我们通过第一个页面点击购买后,连接就断了,哪到第二个页面,它(服务器)怎么知道我买的是哪本书,或者知道我买的是什么,或者我是谁?这就是Cookie在起作用,它帮服务器记住了。(当然这里除了Cookie,还有浏览器的特性,比如每个浏览器有唯一的编号,当我请求第二个页面时,服务器会到我本地来取Cookie信息)
因为Http协议是无连接的,所以它需要一种类似QQ聊天那样的不断与服务器保持连接的机制,用它来记录着客户端浏览器在我服务器端都干什么了,用我们的行话来说就是维护用户跟服务器间的会话状态,所以就产生了Cookie,Session, 以及Application等会话技术。
那Cookie到底是个什么东西呢?
Cookie是服务端写在客户端本地一个文件,你放心不会是病度或木马,因为Cookie只允许它创建txt的文本文件。客户端浏览器也可以阻止Cookie的写入,比如上面买书,如果浏览器Cookie被禁止写入,那么第二个页面购物车将看不到任何东西。还有每个网站写的Cookie都不一样,新浪可以写,搜狐也可以写,但它们都只能拿自己的Cookie。
以Java为例,说说Cookie的用法:
Cookie是以“名-值”对的形式保存的,类似Map;
创建Cookie:new Cookie(name,value);
setName(String name) / getName();
setValue(String value) / getValue();
setMaxAge(int expiry) / getMaxAge();
利用HttpServletResponse的addCookie(Cookie cookie)方法将Cookie设置到客户端;
利用HttpServletRequest的getCookies()方法来读取客户端的所有Cookie;
因为Cookie可以设置存活时间setMaxAge(int expiry),因此就有了存储方式的不同:
1.设置了存活时间的Cookie,会在客户端本地创建一份Cookie文件。
2.没有设置存活时间的Cookie,会在客户端浏览器内存中创建一份Cookie,它在本地Cookie文件中是找不到的,它的生命周期依赖于浏览器窗口,当浏览器窗口关闭,它将消失,而且其它新开的浏览器窗口都访问不到它,只有它和它的子窗口,即通过window.open()出来的,可以访问,测试的时候可以使用快捷键ctrl+n弹出一个子窗口。
经过测试改变设置和访问Cookie的URL路径,Cookie的访问也会有所不同:
1.设置Cookie的Servlet URL:/servlet/SetCookies
访问Cookie的Servlet URL:/ShowCookie
发现SetCookies可以创建Cookie,但ShowCookie访问不到
2.设置Cookie的Servlet URL:/SetCookies
访问Cookie的Servlet URL:/servlet/ShowCookie
发现SetCookies可以创建Cookie,ShowCookie也访问到
从包结构的访问层次来说,就是因为1中,ShowCookie路径比SetCookies高一级,而2中,ShowCookie是SetCookies的子级,因此可以得出一个Jsp/Servlet设置的Cookie可以被同一路径或子路径的Jsp/Servlet访问得到。
总结一下Cookie的特点:
1.服务器可以向客户端写内容
2.只能写文本内容
3.只能拿自己webapp写入的Cookie
4.客户端可以阻止服务器Cookie的写入
5.Cookie分两种:
存在于文本文件
存在于内存(属于窗口/子窗口)
6.一个Jsp/Servlet设置的Cookie可以被同一路径或子路径的Jsp/Servlet访问得到
以上是个人学习和总结,欢迎拍砖。