会话管理
会话管理
HTTP是无状态协议
所以对话只在POST和GET中实现
换句话说就是 在浏览器里走个过场 啥也没留下
Cookie
会话的数据会保存在浏览器客户端 例如:显示 XXX用户上次登录的时间
核心api
Cookie原理
1)服务器创建cookie对象,把会话数据存储到cookie对象中。
1 | Cookie cookie = new Cookie("username","lsieun"); |
2) 服务器发送cookie信息到浏览器
1 | response.addCookie(cookie); |
举例: Set-Cookie: username=lsieun (隐藏发送了一个Set-Cookie名称的响应头)
3)浏览器得到服务器发送的cookie,然后保存在浏览器端。
4)浏览器在下次访问服务器时,会带着cookie信息
举例: Cookie: username=lsieun (隐藏带着一个叫Cookie名称的请求头)
5)服务器接收到浏览器带来的cookie信息
1 | Cookie[] cookies = request.getCookies();//接收浏览器发送的cookie信息 |
Seesion
Cookie 可以让服务端程序跟踪每个客户端的访问,但是每次客户端的访问都必须传回这些 Cookie,如果 Cookie 很多,则无形增加了客户端与服务端的数据传输量,而Session 的出现正是为了解决这个问题。
同一个客户端每次和服务端交互时,不需要每次都传回所有的 Cookie 值,而是只要传回一个 ID,这个 ID 就是客户端第一次访问服务器生成的,而且每个客户端是唯一的。这样每个客户端就有了一个唯一的 ID,客户端只要传回这个 ID 就行了,这个 ID 通常是 NAME 为 JSESIONID 的一个 Cookie。
获取 Session 对象
request对象.getSession()
和参数为true的一样request对象.getSession(true)
获取Session对象,如果没有Session对象,直接创建一个新的返回,缺省值request对象.getSession(false)
获取Session对象,如果没有返回null设置共享数据
1
Session对象.setAttribute(String name, Object value)
- 注意:Session 可以**存储任何类型的数据,**比如登陆用户的信息,可以封装到User对象中
3.修改共享数据 重新设置一个同名的共享数据
4.获取共享数据
1 | Object value = Session对象.getAttribute(String name); |
5.删除 Session 中的共享数据
1 | Session对象.removeAttribute(String name); |
6.销毁 Session
1 | void invalidate() |
7.Session 的超时管理
- 超时:在访问当前的资源的过程中,不和网页进行任何的交互,超过设定的时间就是超时 在 Tomcat 服务器中有默认的配置为30分钟,一般不需要去修改
- 语法:
void setMaxInactiveInterval(int interval)
Filter过滤器
图解:
一般开发的场景应用:
- 日志的记录
- 性能的分析
- 乱码的处理
- 事务控制
- 登录控制
- 跨域的处理
Demo:
1 | package com.wilsit.schedule.test.Filter; |
1 | package com.wilsit.schedule.test.Filter; |
Filter链
执行流程:
filter执行顺序:
是通过xml中的filter-mapping的先后来判断的
如果用注解呢?
可以通过F1-Filter
来当1
F2-Filter
来当2
Listener 监听器
分类:
钝化活化监听器:
其实就是将Session存到磁盘中 降低内存的消耗 在通过session监听器来调节