Servlet详解(三):会话技术与Cookie

会话技术

什么是会话技术呢?

艺术来源于生活,技术也来源于生活。两个总统在一起聊天,我们称作一次会话。两个人进行会话,有两个前提:1. 两个人的语言可以互相沟通 2. 两个人要有记忆力,可以记住对方所说的内容。

在javaweb中,浏览器和服务器之间的通讯也可以看作是两个人在聊天,为了聊天尽兴,所以双方也要拥有"记忆力",可以保存之前的聊天状态。

会话范围:

打开网站,完成所需要的所有需求,是一次会话。

会话技术常见应用:

用户登录后在一段事件内,并不需要再次登录。

浏览器的记忆力:Cookie

服务器的记忆力:Session

在浏览器端记录一些信息

原理:

这个响应头的信息是一个键值对

原理即使设置响应头,浏览器接受响应头保存,然后浏览器下次的请求都会带这这个头的信息。

浏览器获取Cookie:

  1. 默认Cookie时间:

    浏览器关闭时,即会话结束时。’

  2. 指定Cookie时间:

浏览器发送Cookie的条件:

  • 网站域(主机名)相同

  • 网站路径是Cookie的子路经

有一个cookie的路径为 /CookieDemo,主机域是localhost

访问如下路径:

http://localhost:8080/CookieDemo,会发送

http://localhost:8080/CookieDemo/BServlet,会发送

http://baidu:8080/CookieDemo/AServlet,不会发送

http://localhost:8080/Test,不会发送

设置路径

  1. 默认情况

    发送Cookie的资源的所在路径

    例如:发送Cookie的资源路径为 http://localhost:8080/CookieDemo/AServlet 那么Cookie的默认路径就为 /CookieDemo

  2. 手动设置

    设置主机

  3. 默认主机

    发送Cookie资源的服务器主机名

  4. 手动设置

cookie.setMaxAge(0) 覆盖达到删除的目的,需要注意:

只有cookie的路径、键、主机一致才可以覆盖。

Cookie为什么不能使用中文?

在HTTP协议中,除了正文,其他地方都不能使用Latin码表以下的码表

要想发送中文,需要使用 URLEncode 类进行转化,类似Get请求的参数。

URLEncode会将汉字转化为 二进制,然后每八位二进制数转化为两位16进制数,每两位十六进制数之间又使用%隔开。

所以我们经常看到 4C%45%7E%3A 这样的字符串。

然后,在服务器端进行decode解析,就完成了cookie传递中文的效果。

Session

在服务器记录一些信息。

Session原理

类似Cookie…

这里写图片描述

浏览器第一次访问服务器,服务器返回给浏览器一个sessionId,以后浏览器每次请求,都携带着这个sessionID,用来验证自己的身份。

常见用例:购物车,用户将商品加入到购物车中,第一次加入时,服务器给一个sessionId,以后每次加入都向这个ID的购物车加入商品。而且用户在查看购物车时,也会传入sessionID(key),服务器接受到sessionID后,根据SessionID获取Session(即value,购物车的内容)。

那么服务器是怎么返回给浏览器一个sessionID的呢?

通过给浏览器设置一个cookie,即在响应头中添加 set-cookie:JSESSIONID=39FECEA2F;Path=/项目路径,且有效时间未设置(浏览会话结束时)的cookie。

所以浏览器也就是通过request对象携带cookie从而携带sessionID给服务器的。

Session主要用途

最常见的最基本的用于保存登录状态,以及上文的购物车(未登录也会有)

使用Session

Session的寿命

web.xml 中修改标签 <session-config> 标签

在Session对象中也有方法进行设置session的寿命:

sessionID的存在时间?

就是cookie的时间,可以通过获取cookie设置setMaxAge 控制


Session域的范围

  • session的范围就是一次会话期间。


  1. 浏览器第一次访问服务器,服务器创建session对象,会话开始

  2. 浏览器关闭,会话结束,保存的sessionID也就丢失(默认有效事件为一个会话),session也就无效了。

  3. 或者session已经过期了。

  4. session对象在服务器内被手动销毁了

API

最后更新于

这有帮助吗?