一次会话,包含多次请求和响应 http协议:无状态的协议,同一个会话中的连续的多个请求是相互独立的彼此互不了解 会话技术:存储服务器和浏览器多次请求之间的数据 客户端: cookie,服务端 :session cookie 作用,在一次会话中多次请求中共享数据,存储在客户端 ## cookie使用 1. 设置cookie 对象,设置数据到cookie中 Cookie cookie = new Cookie(String name,String value); response.addCookie(cookie) 2. 从cookie 中获取数据,通过request对象,接受cookie数组 Cookie[] cookies = request.getCookies();
逻辑
- 第一次请求:没有携带任何cookie,响应头:set-cookie :name=jack
- 第二次请求:会携带浏览器本地存储的cookie
Cookie 在浏览器保存时间
默认情况下
浏览器关闭(会话结束)cookie销毁(内存)
设置cookie的存活时间
cookie.setMaxAge(int second);--单位是秒
正数:指定存活时间,持久化浏览器的磁盘中,到期后自动销毁
负数:默认浏览器关闭,cookie销毁
0:立即销毁
Cookie 是否可以存储中文
tomcat8之前,不支持中文
URLEncoder 编码
URLDecoder 解码
tomcat8 之后 支持中文
rfc6265 cookie 规范,不允许使用分号,空格 等一些特殊符号
Cookie 特点
- cookie 存储数据部署在客户端
- cookie 存储数据只能是字符串
- cookie 单个大小不能超过4KB
- cookie 存储的数据不太安全
Session
Session 是基于cookie 来实现的
在一次会话多次请求共享数据,存储在服务器中 session 会响应一个cookie : jessionId 第二次请求时 带上jessionId
HttpSession 也是一个域对象
- 存储数据 void setAttribute(String name,Object value)
- 获取数据 Object getAttribute(String name)
- 删除数据 void removeAttribute(String name)
逻辑
将数据存储到session中
1. 通过request 对象获取session 对象
httpSession session = request.getSession();
2. 操作session的API, 存储数据
session.setAttribue("username","哈哈,呵呵")
从session 中获取数据
1. 通过request对象,获取session对象
HttpSession session = request.getSession();
2. 操作session的API,获取数据
session.getAttribute("username")
HttpSession session = req.getSession()进行判断 1. 如果用户第一次访问,创新新的session 对象进行编号 2. 如果不是第一次访问呢,根据浏览器发送请求携带的编号,找到session对象,如果没有找到,再创建
生命周期
- 何时创建 用户第一次调用request.getSession() 方法时创建
- 何时销毁 服务器非正常关闭, 非活跃状态30分钟后, Tomcat进行配置 session.invalidate();
- 作用范围 一次会话,多次请求之间 每个浏览器和服务器之间都是独立的对话