Web 开发会话技术 -Session
—session 技术
- Session 是服务器端技术,服务器在运行时为每一个用户的浏览器创建一个其独享的 session 对象/集
- 由于 session 为各个用户浏览器独享,所以用户在访问服务器的不同页面时,可以从各自 的 session 中读取/添加数据, 从而完成相应任务
session 基本原理
1. 当用户打开浏览器,访问某个网站, 操作 session 时,服务器就会在内存(在服务端)为该
浏览器分配一个 session 对象,该 session 对象被这个浏览器独占, 如图
2. 这个 session 对象也可看做是一个容器/集合,session 对象默认存在时间为 30min(这是在tomcat/conf/web.xml),也可修改
Session 可以做什么
1. 网上商城中的购物车
2. 保存登录用户的信息
3. 将数据放入到 Session 中,供用户在访问不同页面时,实现跨页面访问数据
4. 防止用户非法登录到某个页面
5. .....
如何理解 Session
1. session 存储结构示意图
2. 你可以把 session 看作是一容器类似 HashMap,有两列(K-V),每一行就是 session 的一个属性。
3. 每个属性包含有两个部分,一个是该属性的名字(String),另外一个是它的值(Object)
Session 的基本使用
1. 创建和获取 Session,API 一样
HttpSession hs=request.getSession();
第 1 次调用是创建 Session 会话, 之后调用是获取创建好的 Session 对象
2. 向 session 添加属性
hs.setAttribute(String name,Object val);
3. 从 session 得到某个属性
Object obj=hs.getAttribute(String name)
4. 从 session 删除调某个属性:
hs.removeAttribute(String name);
5. isNew(); 判断是不是刚创建出来的 Session
6. 每个 Session 都有 1 个唯一标识 Id 值。通过 getId() 得到 Sessio
session 底层实现机制
原理分析图
代码演示
CreateSession.java
1. public class CreateSession extends HttpServlet { 2. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 3. //System.out.println("CreateSession 被调用..."); 4. 5. //1. 获取session, 同时也可能创建session 6. HttpSession session = request.getSession(); 7. 8. //2. 给session获取id 9. System.out.println("CreateSession 当前sessionid= " + session.getId()); 10. //3. 给session存放数据 11. session.setAttribute("email", "zs@qq.com"); 12. 13. //4. 给浏览器发送一个回复 14. response.setContentType("text/html;charset=utf-8"); 15. PrintWriter writer = response.getWriter(); 16. writer.println("<h1>创建/操作session成功...</h1>"); 17. writer.flush(); 18. writer.close(); 19. 20. } 21. 22. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 23. doPost(request, response); 24. } 25. }
测试 Session 创的机制, 注意抓包分析
ReadSession.java
1. public class ReadSession extends HttpServlet { 2. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 3. //System.out.println("ReadSession 被调用..."); 4. // 演示读取session 5. //1. 获取session, 如果没有sesion, 也会创建 6. HttpSession session = request.getSession(); 7. //输出sessionId 8. System.out.println("ReadSession sessionid= " + session.getId()); 9. //2. 读取属性 10. Object email = session.getAttribute("email"); 11. if (email != null) { 12. System.out.println("session属性 email= " + (String) email); 13. } else { 14. System.out.println("session中没有 email属性 "); 15. } 16. //给浏览器回复一下 17. response.setContentType("text/html;charset=utf-8"); 18. PrintWriter writer = response.getWriter(); 19. writer.println("<h1>读取session成功...</h1>"); 20. writer.flush(); 21. writer.close(); 22. } 23. 24. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 25. doPost(request, response); 26. } 27. }
测试 Session 读取的机制, 注意抓包分析