session
注意,参数小结:
-
xxxParameter(?)
:- request get与post请求参数
-
xxxAttribute(?)
:- request 一次请求域,
- request/this.getServletContext()项目全局域
- request.getSession() 一次会话域
概念:服务端会话技术,在【一次会话】的【多次请求间】【共享数据】,将数据保存在服务器的对象中。HttpSession
一、快速入门
1.获取HttpSession对象
HttpSession session = request.getSession();
2.使用HttpSession对象
Object getAttribute(String name)
void setAttribute(String name, Object value)
void removeAttribute(String name)
二、session原理
【一个客户端的一次会话或者一个客服端访问的一段时间内对应着一个session】:客户端第一次访问,并且存入了进行了req.getSession()操作,判断cookie中是否有JSESSIONID,没有会在内存中创建一个session对象,并将客户端的set-cookie中添加一个JSESSIONID=sessionid;当客户端第二次访问的时候,如果又要req.getSession(),判断cookie中是否有JSESSIONID,有就直接返回对应的session对象了。
1.当客户端关闭后,服务器不关闭,两次获得session是否为同一个?
session原理是依赖于Cookie的,默认情况下,第一次访问获得session,Cookie中没有JSESSIONID,会在内存中创建一个,并将JSESSIONID写入Cookie;第二次访问,发现,有JSESSIONID,直接拿来用;如果浏览器重启,Cookie中的JSESSIONID并没有持久化保存,所以请求头的Cookie中没有JSESSIONID,所以只能新建了。如果需要一样,可以如下操作一波!
- 默认情况下。不是
- 如果需要相同,可以创建Cookie,键为
JSESSIONID
,设置最大存活时间,让cookie持久化保存【相当于复写set-cookie中的JSESSIONID】。
HttpSession session = req.getSession();
session.setAttribute("key", "value");
Cookie cookie = new Cookie("JSESSIONID", session.getId());
cookie.setMaxAge(60 * 60);
resp.addCookie(cookie);
2.客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
- 很明显,绝不可能是同一个对象,内存都清空完了。
- 【本地tomcat中部署的项目】但是要确保数据不丢失。tomcat服务器会做做一件事【不关我们的事儿!】
- session的钝化:在服务器正常关闭之前,将session对象序列化到硬盘上
- session的活化:在服务器启动后,将session文件转化为内存中的session对象
部署在tomcat的webapps下的项目,在tomcat服务器正常关闭【别直接点终端右上角的叉叉】的时候,会在work\Catalina\localhost\对应的项目文件夹中将session序列化生成SESSIONS.ser文件,当下次服务器重启时会将此文件加载在内存中反序列化并将此文件删除!
- 【IDEA中配置的部署项目】session被清空完了!
IDEA中把项目正常关闭,tomcat服务器会在当前项目配置文件夹下【根据控制台消息
Using CATALINA_BASE:
所指向的路径】的work文件夹下对应的地方钝化一个序列化文件,但是在下一次启动时,整个work文件夹都被删除重新创建了,自然就读取不到该序列化文件了
3.session在什么时候被销毁?
- 服务器关闭
- session对象调用方法
session.invalidate()
- session默认失效时间30分钟,修改多有项目的web.xml的父配置文件【tomcat下的conf下的web.xml】可以选择性修改配置
31
当然,每个项目内部的web.xml也可以配置覆盖父配置!
三、session的特点
- session用于存储一次会话的多次请求的数据,存在服务器端
- session可以存储任意类型,任意大小的数据
session与Cookie的区别
- session存储数据在服务器端,Cookie在客户端
- session没有数据大小限制,Cookie有
- session数据安全,Cookie数据相对安全
四、案例:验证码
- 案例需求:
- 访问带有验证码的登录页面login.jsp
- 用户输入用户名,密码以及验证码。
- 如果用户名和密码输入有误,跳转登录页面,提示:用户名或密码错误
- 如果验证码输入有误,跳转登录页面,提示:验证码错误
- 如果全部输入正确,则跳转到主页success.jsp,显示:用户名,欢迎您
- 验证码每一次验证之后,都会删除或者刷新!