JAVA会话技术

会话技术

Http是一个无状态的协议,多次请求之间是互相独立的。

为了解决多次请求之间 由于无状态协议导致的无法数据共享的问题,引入了会话技术。

会话:从客户端连接到服务器开始,直到客户端和服务器断开连接为止,这样的一个过程称之为一次会话。

在一次会话中,可能有多次请求和响应。在一次会话中,可以通过会话技术共享数据。

Cookie--客户端会话技术

  1. Cookie的数据存储在客户端

  2. Cookie的数据都是键值对 name-value。类型都是字符串

  3. Cookie有数量和大小限制的。

  4. Cookie设置的时候是通过响应头携带到浏览器的。

  5. 当浏览器向服务器发起请求时,会把符合要求的所有cookie自动携带到服务器上,通过请求头携带。

cookie的属性

name:cookie的名字

value:cookie的值

path:cookie的有效路径

可以设置的。如果不设置,有默认值。

默认值:访问某个资源,该资源设置了cookie,会把该资源的URI,截取到最后一个/的字符串,作为默认path。

有效路径的作用:在客户端发起请求时,如果请求的路径符合有效路径的匹配规则,则在请求时携带该cookie,否则不携带。

一般情况下,我们会把cookie的有效路径设置为虚拟目录,保证在整个项目中共享该cookie

cookie.setPath(req.getContextPath());

domain:cookie的有效域名

可以设置的。如果不设置,有默认值。

默认值就是访问某个资源,该资源设置了cookie,会把该资源的域名作为有效域名。

有效域名的作用:在客户端发起请求时,如果请求的域名符合有效域名的匹配规则,则在请求时携带该cookie,否则不携带。

一般情况下无需设置。但是如果是集团性的服务器集群,需要设置为集团的一级域名。

例如:cookie.setDomain(".baidu.com")

maxAge:最大存活时间,默认值为-1

负数:默认值,代表当前cookie是一个会话级别的cookie,随着会话的结束而销毁。此时数据存储在浏览器内存中的而不是本地文件。

正数:有效时间,代表当前cookie是一个持久化cookie,会保存在浏览器对应的一个硬盘文件上。知道有效时间过期之后才会自动销毁。

0:用于删除持久化cookie。要满足一些前提条件。

cookie的name要和被删除的一致。

cookie的value没有任何要求。

cookie的path要和被删除的一致。

cookie的domain要和被删除的一致。

cookie的maxAge要设置为0,代表直接过期删除掉。

Cookie操作相关的api

设置cookie

响应对象中,通过addCookie(Cookie c)方法添加cookie到浏览器。

获取cookie

请求对象中,通过Cookie[] getCookies()方法获取当前请求中携带的所有Cookie对象。

Cookie存储中文

Cookie本身是由http的头进行数据传输的,所以不支持中文,如果要存储中文数据,必须把中文转为非中文形式。

推荐使用URLEncode的方式进行操作,此操作不是自动的,需要手动进行编解码。

URLEncoder.encode(String str,String encoding)// 把中文字符串以指定的字符集转为非中文表示形式
URLDecoder.decode(String str,String encoding)// 把从cookie中拿到的编码后的字符串还原为中文形式

Session--服务器端会话技术

HttpSession

数据存储在服务器上,存储在服务器内存中。

session底层是基于cookie实现的

 

session本身也是一个域对象,可以存储任意类型的数据。

作用范围就是一次会话。

理论上没有大小限制,实际受服务器内存大小的限制。

已经学习过的三个域: request域 < session域 < application域

api:

getId()// 获取session的id,也就是唯一标识
invalidate()// 销毁当前session,自杀方法

创建:在一次会话中,第一次调用request.getSession()方法时,会由服务器创建一个session对象,然后把id通过cookie返回给浏览器。

创建session时,cookie默认的maxAge为-1。

销毁:

  1. 当浏览器关闭时,携带sessionid的cookie销毁了。但是服务器内存中的session对象并不会实时销毁,只不过没有id找不到了。等session超时之后,服务器会把它销毁掉。默认超时时间为30分钟。

    可以在web.xml中配置session的默认过期时间,单位是分钟

    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>
  2. 当服务器正常关闭时,session会被序列化到硬盘上;服务器再次启动时,会自动把序列化的session再反序列化到内存中。序列化的过程我们称为钝化。反序列化的过程叫做活化。但是要注意:钝化和活化过程中,session中的对象如果也要跟着进行序列化和反序列化,它必须实现序列化接口。钝化的操作在服务器压力比较大的时候也会自动进行。

  3. 当服务器非正常关闭时,此时session会直接被销毁。

  4. 手动调用session的invalidate方法,此时session会直接被销毁掉。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值