会话的概念:会话就是对某个web应用程序的一次整体访问的过程。
会话问题:
业务完成需多次请求,如购物车
无连接的Http协议是
无状态的,不能保存每个客户端私有信息
如何保存客户端私有信息?
会话跟踪:解决同一时刻不同客户端会话私有数据的保存
两种实现:
1、Session :服务器分配的保存客户端私有信息的一块内存空间;
机制----
客户端向服务端发出首次请求,服务器为此客户端产生session对象,并将生成一sessionId,应答时返回到客户端,客户端保存此id。当同一个客户端向服务器发出新的请求时,要将上次得到的sessionId一同发出,服务器检查用户的sessionId,根据他取得对应session对象。
sessionId是session的唯一标识,服务器通过sessionId将客户端与session数据对应起来,session存储在服务器端
Session对应的类为javax.servlet.http.HttpSession,每个访问者对应一个session对象,所有该用户的状态信息都保存在这个Session对象中,Session对象是客户端第一次请求服务器时创建的,它是key-value属性,通过setAttribute(String key)和getAttribute(String key ,Object value)的方法读取客户状态信息。
Servlet里通过request.getSession()的方法获取该客户的Session,JSP里内置了Session的隐藏对象,,可以直接使用。
session常用方法
方法名 | 返回值 | 定义 |
getId() | String | 获得当前Session的SessionID |
isNew() | boolean | 判断Session是不是新创建的 |
getCreationTime() | long | 获得当前Session创建的时间 |
getLastAccessedTime() | long | 获得客户最后一次请求的时间 |
setMaxInactiveInterval(int interval) | void | 设置Session最大请求间隔时间 |
getMaxInactiveInterval() | int | 获得Session最大请求间隔时间 |
setAttribute(String key,Object value) | void | 向Session空间中存储对象 |
getAttribute(String key) | Object | 从Session中获取对应的对象 |
removeAttribute(String key) | void | 从Session中删除对应的对象 |
getAttributeNames | Enumeration | 返回session存储的key的集合 |
invalidate() | void | 强制Session过期 |
设置缺省过期时间:
在tomcat中的web.xml文件中可以使用以下配置来控制session过期时间:
<session-config>
<session-timeout>15</session-timeout>
</session-config>
<session-timeout>参数的单位为分钟,setMaxInactiveInterval(int s)单位为秒
2、Cookie
默认方式,Netscape发明。
ServletAPI规范要求使用方式。
它的运行机制对我们是透明的。
可以显示设置cookie
Java中把cookie封装成javax.servlet.http.Cookie类,服务器通过操作Cookie类对象对客户端Cookie进行操作,通过request.getCookie()获取客户端提交的所有Cookie(以Cookie[]数组形式返回),通过response.addCookie(Cookie cookie) 向客户端设置Cookie,Cookie对象使用key-value形式保存用户状态
Session与Cookie对比
比较内容 | Session | Cookie |
保存方式 | 数据内容保存在服务器端 | 数据内容保存在客户端 |
安全性 | 数据比较安全 | 数据相对不安全 |
生命周期 | 使用内存存放数据,当用户长时间未请求服务器或服务器重启,内容可能丢失 | 保存在客户端的内存或文件中,可以指定Cookie的生存周期 |
资源占用 | 占用服务器的内存 | 每次请求时发送Cookie内容,占用带宽 |
存放内容 | 可以存放各种数据类型的数据 | 只能存放字符串类型的数据 |