http协议与会话:cookie和session

7 篇文章 2 订阅

一次会话:可以简单的理解:打开一个浏览器,访问某一个站点,在该网址内部查看信息,
点击超链接等相关的操作,最后关闭浏览器的整个过程,称之为一次会话.

HTTP协议特点:
无状态连接.服务端不知道上一次是哪一个客户端请求了自己.
无状态连接带来的问题:
在一次会话中,我们可以查看多个资源,每一个资源都会先发送请求,再响应,每次的请求都是客户端发出的.
但是,HTTP是无状态的,它不知道上一次是谁请求了自己.
也就是说,在一次会话中,多个请求之间无法共享数据,无法跟踪用户的会话信息.

Cookie是一个客户端技术,该技术是把会话的信息,存储到客户端,当客户端访问网站中的资源时,该客户端就会携带该Cookie信息,一起来访问网站,网站就可以从客户端的Cookie获取到会话信息

  1. 创建Cookie对象
    Cookie c = new Cookie(String name,String value);
  2. 把Cookie发送给客户端
    resp.addCookie©;
    注意:Cookie信息中不能存有中文
    修改Cookie的值:只能发生一个同名称的新的Cookie,把原来的Cookie在客户端覆盖

cookie使用:
1:获取Cookie信息
Cookie[] cs = req.getCookies();
注意:空指针异常
2:取出Cookie中的信息
cookie.getName(); 获取当前cookie的名称
cookie.getValue(); 获取当前cookie的值
3、Cookie的分类(会话Cookie和持久化Cookie)
会话Cookie:该Cookie仅在当前这次会话中有效(浏览器关闭后,Cookie无效了)
持久Cookie:该Cookie在某段时间内有效(跟会话次数无关)

4、关键方法:cookie对象.setMaxAge(int seconds);
seconds > 0: 持久Cookie
seconds = 0: 删除该Cookie
seconds < 0: 会话Cookie
5、Cookie的缺陷,引出Session:
1):多个人使用同一台电脑的时候,可以查看浏览器的Cookie,不安全.
2):Cookie存储中文比较麻烦(得编码,再解码).
3):Cookie的value是String类型,一个Cookie就只能存储一个数据,如果需要存储多个数据,就得写N个Cookie.
4):一个站点对Cookie有限制:
Cookie大小限制在4KB之内;
一台服务器在一个客户端最多保存20个Cookie;
一个浏览器最多可以保存300个Cookie;

session
Session技术:本身Session的意思就是会话,表示一次会话,
和Cookie对比,Session是把会话的信息存储到服务器中,然后给以客户端一个存储的凭证,客户端拿到这个凭证后,以后访问该网站时通过该凭证,拿到会话的信息

1:获取当前客户端的Session对象
HttpSession session = req.getSession();
获取当前客户端对于的session对象,如果没有马上创建新的session并返回

2:往session中存入数据
session.setAttribute(String name, Object obj);

3:取出session中的数据
Object obj = session.getAttribute(String name);

4:删除Session(用户注销登陆).

  • 删除Session中指定属性名的值.session对象.removeAttrbute(“currName”);

  • 销毁Session对象(Session中所有的属性都不存在).session对象.invalidate();

5.Session的超时管理

  • 在超时时间之内,如果客户端和服务端没有交互(用户的两次操作之间不能超过该时间),则自动的销毁Session.
  • session对象.setMaxInactiveInterval(60 * 10);//超过10分钟,销毁Session.
  • Tomcat服务器的默认超时时间为:30分钟,Tomcat一般在20多分钟就销毁了.

6、Session:session的生命周期是一次会话时间(默认cookie会话cookie)
TCP三次握手,连接一断就结束生命周期

7、Session技术底层依靠了Cookie,该Cookie也是一个会话Cookie

注意点:

  • 一般的,我们存储到Session中的属性名称,要唯一,我们习惯XXX_IN_SESSION:
    session对象.setAttribute(“USER_IN_SESSION”,“bunny”);
  • 若需要把多个数据存放到Session中,就得调用setAttribute方法N次,可以的.
    一般的,我们把需要存储的数据,封装成一个对象,然后在存储到Session中. 把用户的信息,封装到user对象.
    session对象.setAttribute(“USER_IN_SESSION”,user对象);
  • 如果多台服务器之间需要共享Session,此时Session中的对象,必须实现java.io.Serializable(才能在网络上传输).
    序 列 化: 把对象信息存储为二进制.
    反序列化: 把二进制信息恢复成对象.
    public class User implements java.io.Serializable{…}
  • Session是一种特殊的Cookie,而浏览器可以禁用Cookie. 此时,需要在每一个资源之后,手动的携带session的ID.
    /session/list;jsessionid=地址 String url =
    response.encodeURL("/session/list");自动的在资源之后拼接;jsessionid=地址

#注意:开发中都不会取消接受Cookie的.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

RachelHwang

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

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

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

打赏作者

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

抵扣说明:

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

余额充值