Session的基本使用
Session : 服务端会话跟踪技术
- 将数据保存到服务端
JavaEE提供HttpSession接口来实现一次会话之间的多次请求之间的数据共享功能
Session的使用:
-
获取Session对象
- HttpSession session = request.getSession();
- 其实底层就是获取request请求的cookie请求头, cookie请求头中会携带一个Session ID,如果服务器内存中没有对应的Session ID值的Session对象的时候就会在服务器内存中创建一个, 如果服务器内存汇总有对应的Session ID的Session对象, 就会直接将对应的Session对象返回
- 在一个会话中第一次创建Session对象的时候,我们使用getSession()方法的session请求头中肯定是没有Session ID值的, 所以就会创建一个新的Session对象
- 其实底层就是获取request请求的cookie请求头, cookie请求头中会携带一个Session ID,如果服务器内存中没有对应的Session ID值的Session对象的时候就会在服务器内存中创建一个, 如果服务器内存汇总有对应的Session ID的Session对象, 就会直接将对应的Session对象返回
- HttpSession session = request.getSession();
-
Session对象功能:
-
void setAttribute(String name, Object o)
- 存储数据到Session域中
-
Object getAttribute(String name)
- 根据key, 获取值
-
void removeAttribute(String name)
- 根据key, 删除该键值对
-
我们可以发现: 域对象的方法是一种通用形式, 我们之前request域中也是学习了这几种方法, 和此时的Session域对象中的方法是一样的
补充:
浏览器第一次请求服务器的时候, 如果这个时候我们在后端中使用request对象调用了getSession()方法之后, 这个时候就是第一次创建了Session对象, 这个时候我们第一次创建Session对象之后我们响应数据的到前端的时候就会携带一个set-cookie响应头, 响应头中是JSESSIONIID值(也就是Session对象id唯一标识), 那么这个时候浏览器就会解析到这个set-cookie响应头, 解析到这个响应头之后就会在浏览器中创建一个Cookie对象, 然后之后每一次请求此服务器的时候都会携带一个请求头(cookie) , 这个请求头中存储的就是JSESSIONID值
- 这个时候一定要注意: 我们只有第一次创建一个Session对象的时候在这一次中我们会在响应数据中有set-cookie响应头, 其中是JSESSIONID值, 因为第一次创建Session对象之后我们必须要让将这个Session对象的ID值以Cookie对象的形式存储到浏览器中, 下一次的时候如果浏览器请求这个服务器的时候就会以Cookie的方式携带对应的Sessionid到服务器中
- 一旦我们创建了Session对象之后, 那么我们响应JSESSIONID的操作就是通过服务器来完成的, 不用我们手动响应
一旦浏览器和服务器请求连接成功之后, 那么这个时候会话就已经是建立了, 但是这个时候只是建立了会话, 但是这个时候我们不是说在会话刚刚建立的时候就要创建Session对象, 我们可以在一次会话中的第n次请求中才创建Session对象
我们的后端存储共享数据的时候是存储到Session中, 前端存储共享数据是存储到浏览器中
- 前端存储共享数据的时候通过本地储存和会话级别存储来完成共享数据的存储
- 如果是存储到本地的时候那么即使我们关闭掉浏览器之后我们的本地存储中的数据也还是存在的, 但是如果是存储到会话级别之后如果我们浏览器关闭之后我们的会话就会结束, 这个时候我们如果是存储到会话级别的共享数据就会被销毁
- 本地存储: window.sessionStorage.setItem(key, value);
- 会话级别存储: window.session.Storage.setItem(key, value);
我们后端如果需要共享数据的时候就使用Session, 如果不需要共享数据的时候我们就不需要使用Session对象
浏览器中存储数据的时候是以域名为单位进行存储的, 不同域名之下的数据分开存储, 所以我们也可以发现请求服务器的时候会携带服务器所在域名之下的所有的Cookie数据