一、为什么要使用session?
在我们去访问某个网站时,像淘宝和博客之类的等等,它都需要登录才可以去购买东西或者更近一步的去访问更多的数据,在没学习session之前,由于http协议是无状态的,浏览器发出去的每一次请求/响应对方都会认为是一个新的请求,这就导致了很多问题,比如购物车加入商品,下次再去访问浏览器会认为是一个新的请求,而数据丢失等等,怎么解决http无状态的问题,使用它变得有记忆呢?——会话技术。
二、什么是session对象?
- 会话跟踪机制: 一种服务器端的机制
- 用户第一次请求服务器时创建会话,并返回sessionId
- 后续请求携带该sessionId,携带同一sessionId的请求被认为处于同一个会话中。
补充:
使用session内置对象描述一次会话,一次会话包含多次请求和响应。
三、session对象的工作原理
1. 没使用session的情景:
比如,当用户去访问一个网站,该网站需要登录才可以进行一系列操作,但是用户直接在输入栏上输入了该网站首页的地址,照样可以进去,造成了一个弊端: (用户没有登录就可以直接访问)
2. 使用session的情景:
使用session会话技术,当去请求一个login登录页面,服务器会进行判断该请求是否携带了一个sessionId或该sessionId和服务器里的是否匹配。如果没有携带,服务器就会创建一个session,并响应login页面,当用户按下登录键,浏览器会再次发送do_login请求,(该页面用于验证登录是否正确),如果正确,在该会话中设置一个标识属性,如: userName用户名(用于下次访问时判断是否已经登录),跳转到index首页。如果该用户没有登录就去访问首页,那么此时session里的userName属性就会为空,则没有登录,跳转到login页面。
注: 示例图: login.jsp 登录页面、do_login验证登录页面、index.jsp首页。
四、session对象的生命周期
- 每个session对象都与一个浏览器窗口对应(不同版本会有差别)
- 重新开启一个浏览器窗口,可以重新创建一个session对象(但不代表以前的对象过期了,它其实还在)。
- 在一个浏览器窗口,重新打开一个子窗口,还是处于同一个会话中。
- 使用setMaxInactivelnterval(秒) 可以设置会话的非活动时间(即页面不活动时它的有限时间)。
- invalidate() 销毁会话
- 页面长时间不操作的话,默认有效时间是30分钟。
五、session对象常用方法
方法名称 | 说明 |
String getId() | 获取sessionId |
long getCreationTime() | 返回session对象创建的时间,以毫秒为单位 |
void setMaxInactiveInterval(int interval) | 设定session的非活动时间,以秒为单位 |
int getMaxInactiveInterval() | 获取session的有效非活动时间,以秒为单位 |
void invalidate() | 设置session对象失效 |
void setAttribute(String key,Object value) | 以key/value的形式将对象保存到session中 |
Object getAttribute(String key ,Object value) | 通过key获取session中保存的对象 |
void removeAtribute(String key) | 从session中删除属性 |
fejfiefjefjfjdjdj