JavaWEB必知必会-会话机制-cookie和session

目录

  1. Cookie
  2. Session

1 会话技术简介

1.1 存储客户端的状态

何为储存客户端状态?例如网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识别客户端的状态。会话技术是帮助服务器记住客户端状态(区分客户端)

1.2 会话技术

从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话。会话技术就是记录这次会话中客户端的状态与数据的。
会话技术分为Cookie和Session:

  • Cookie:数据存储在客户端本地,减少服务器端的存储的压力,安全性不好,客户端可以清除cookie
  • Session:将数据存储到服务器端,安全性相对好,但要增加服务器的压力

2 Cookie技术

Cookie技术是将用户的数据存储到客户端的技术,我们分为两方面学习:

  1. 服务器端怎样将一个Cookie发送到客户端
  2. 服务器端怎样接受客户端携带的Cookie

2.1 服务端发送Cookie

服务端往客户端发送Cookie的步骤:

  1. 创建Cookie
  2. 设置Cookie在客户端持久化时间
  3. 设置Cookie的携带路径
  4. 向客户端发送该Cookie

2.1.1 创建Cookie

Cookie cookie = new Cookie(String cookieName,String cookieValue);
示例:

注意:cookieValue不能为中文.

2.1.2 设置Cookie持久化时间

cookie.setMaxAge(int seconds); —时间秒
注意:如果不设置持久化时间,cookie会存储在浏览器的内存中,浏览器关闭 cookie信息销毁(会话级别的cookie),如果设置持久化时间,cookie信息会 被持久化到浏览器的磁盘文件里.
示例: 存储时间一周的cookie

设置cookie信息在浏览器的磁盘文件中存储的时间是一周,过期浏览器自动删除该cookie信息.

2.1.3 设置cookie携带路径

cookie.setPath(String path);
注意:如果不设置携带路径,那么该cookie信息会在访问产生该cookie的web资源所在的路径都携带cookie信息
示例:

代表访问javaWeb03应用中的任何资源都携带cookie

代表访问javaWeb03应用中的CookieDemo1时才携带cookie信息

2.1.4 向客户端发送cookie

response.addCookie(Cookie cookie);
示例:

那么该cookie会以响应头的形式发送给客户端.

在浏览器的隐私历史记录中,就能看到该cookie的信息

2.1.5 删除cookie

如果想删除客户端的已经存储的cookie信息,那么就使用同名同路径的持久化时间为0的cookie进行覆盖即可.

再到浏览器查看,cookie已经被删除

2.2 服务器端接收Cookie

2.2.1 通过request对象获取所有Cookie

Cookie[] cookies = request.getCookies();

2.2.2 获取指定名称的Cookie

通过遍历cookies数组,调用getName()方法进行匹配.在遍历之前,最好进行非空校验,避免空指针异常.

3 Session技术

3.1 Session技术简介

Session技术是将数据存储在服务器端的技术,会为每个客户端都创建一块内存空间存储客户的数据,但客户端需要每次都携带一个标识ID(JSESSIONID)去服务器中寻找属于自己的内存空间。所以说Session的实现是基于Cookie,Session需要借助于Cookie存储客户的唯一性标识JSESSIONID
在Session这我们需要解决如下三个问题:

  1. 怎样获得属于本客户端的session对象(内存区域)?
  2. 怎样向session中存取数据(session也是一个域对象)?
  3. session对象的生命周期?

3.2 获取session对象

HttpSession session = request.getSession();

只要在服务器端调用了getSession()方法,服务器端就会往客户端发送一个cookie,名为JSESSIONID.

再次访问,就会带着该cookie,目的就是去寻找属于本客户端的session,即属于本客户端的服务器内存空间.

如果服务器端没有该会话的Session对象会创建一个新的Session返回,如果已经有了属于该会话的Session直接将已有 的Session返回(实质就是根据JSESSIONID判断该客户端是否在服务器上已经存在session了)

3.3 向session对象存取值

Session也是存储数据的区域对象,所以session对象也具有如下三个方法:

  • session.setAttribute(String name,Object obj);
  • session.getAttribute(String name);
  • session.removeAttribute(String name);

但是要注意通过getAttribute()方法拿到的都是Object对象,需要对返回值进行强转.

3.4 session对象的生命周期

3.4.1 session何时被创建?

当服务器第一次执行reques.getSession()的时候.session创建,在服务器内存开辟一块空间给客户端,并生成一个名为JSESSIONID的cookie保存在客户端.
但由于cookie可以被人为的禁止,必须有其它的机制以便在cookie被禁止时仍然能够把session id传递回服务器,经常采用的一种技术叫做URL重写,就是把session id附加在URL路径的后面,附加的方式也有两种,一种是作为URL路径的附加信息,另一种是作为查询字符串附加在URL后面。网络在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。

3.4.2 关于URL重写

URL重写,在用户浏览器禁止cookie的情况下,保持用户会话.
首先服务器通过response的encodeURL()及encodeRedirectedURL()方法首先判断 cookies 是否被浏览器支持;如果支持,则参数 URL 被原样返回,session ID 将通过cookies 来维持.
URL重写实际上就是把session ID放在URL里面,一般上如果浏览器开启cookie那么session ID就存放在cookie里面, 但如果cookie被禁用那么session ID就会放在URL里面, 这就是URL重写.
URL重写是保证一个会话操作的方法之一.比如当你登陆localhost:8080/javaWeb03/regist.html表单时进行某些操作,那些URL额外的数据就附加到表示该会话的每个URL上,并且服务器把这个标识符与关于会话所有储存的数据相关联.重写后为
localhost:8080/javaWeb03/regist.html?jsessionid=12345
附加会话信息为jsessionid=12345
即使浏览器不支持cookie或用户禁用cookie时,这种方法也能起作用.

测试

首先禁用浏览器的cookie

访问http://localhost:8080/javaWeb03/set 给session设置属性

因为服务器端没做处理,所以依然会采用之前的方式设置cookie.然后访问http://localhost:8080/javaWeb03/get 获取值.会发现两次sessionId值不同.

3.4.3 session何时被销毁

在以下三种情况下,session被销毁.
  1. 服务器关闭时
  2. session过期/失效(默认30分钟)

30分钟,是从不操作服务器端资源开始计时.这个默认的时间可以修改.在web.xml中进行以下配置:

  1. 服务器端执行session.invalidate()方法

3.4.4 浏览器关闭时session是否被销毁?

不是.关闭浏览器时session对象并没有被销毁.而是客户端的cookie:JSESSIONID被销毁.所以我们再次打开浏览器的时候,再也找不到之前属于我们的那一块空间了.这块空间,也会在服务器关闭,或者我们不操作服务器资源30分钟(默认时间)之后自动销毁.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Miracle_PHP|JAVA|安全

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值