`
yuwenlin2008
  • 浏览: 124751 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

WebApp之Cookie原理

阅读更多

  要说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访问得到

 

  以上是个人学习和总结,欢迎拍砖。

 

1
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics