zoukankan      html  css  js  c++  java
  • 会话管理入门

    2. 会话管理入门

                      2.1 生活中会话

                              我: 小张,你会跳小苹果码?

                              小张: 会,怎么了?

                              我: 公司年会上要表演节目,你教教我把

                              小张:没问题,一顿饭而已。

                              我: OK。

                              。。。。。。。。

                              在这次生活中的会话中产生通话记录(会话数据)

                      2.2 软件中的会话

                      一次会话: 打开浏览器 -> 访问一些服务器内容 -> 关闭浏览器

                      登录场景:

                              打开浏览器 -> 浏览到登陆页面 -> 输入用户名和密码 -> 访问到用户主页(显示用户名)

                                                                                                                                                修改密码(输入原密码)

                                                                                                                                                 修改收货地址

                                                                                                                                                .......

                              问题:在此处登录会话过程中产生的数据(用户会话数据)如何保存下来呢?

                      购物场景:

                               打开浏览器 -> 浏览商品列表  -> 加入购物车(把商品信息保存下来)  -> 关闭浏览器

                               打开浏览器->  直接进入购物车 -> 查看到上次加入购物车的商品 -> 下订单 -> 支付

                              问题: 在购物会话过程中,如何保存商品信息??

                               会话管理: 管理浏览器客户端 和 服务器端之间会话过程中产生的会话数据。

                              域对象: 实现资源之间的数据共享。

                              request域对象

                              context域对象

                     

                      登录场景:

                              小张: 输入“张三” (保存数据: context.setAttribute("name","张三")) -> 用户主页(显示“张三”)

                              小李: 输入“李四”(保存数据:context.setAttribute("name","李四")) ->   用户主页(显示“李四”)

                                                问题: context是所有用户公有的资源!!!会覆盖数据。

                              小张: 输入“张三”(保存数据: request.setAttribute("name","张三"))- > 用户主页(显示“张三”)                                         问题: 一定要使用转发技术来跳转页面!!!

                      解决办法: 可以使用session域对象来保存会话数据!!!

                      2.3 会话技术

                              Cookie技术:会话数据保存在浏览器客户端。

                              Session技术:会话数据保存在服务器端。

                     

    3 Cooke技术

                              3.1 特点

                              Cookie技术:会话数据保存在浏览器客户端。

                              3.2 Cookie技术核心

                              Cookie类:用于存储会话数据

                                       1)构造Cookie对象

                                                Cookie(java.lang.String name, java.lang.String value)

                                       2)设置cookie

                                                void setPath(java.lang.String uri)   :设置cookie的有效访问路径

                                                void setMaxAge(int expiry) : 设置cookie的有效时间

                                                void setValue(java.lang.String newValue) :设置cookie的值

                                       3)发送cookie到浏览器端保存

                                                void response.addCookie(Cookie cookie)  : 发送cookie

                                       4)服务器接收cookie

                                                Cookie[] request.getCookies()  : 接收cookie

                              3.3 Cookie原理

                                       1)服务器创建cookie对象,把会话数据存储到cookie对象中。

                                                         new Cookie("name","value");

                                       2)  服务器发送cookie信息到浏览器

                                                         response.addCookie(cookie);

                                                         举例: set-cookie: name=eric  (隐藏发送了一个set-cookie名称的响应头)

                                       3)浏览器得到服务器发送的cookie,然后保存在浏览器端。

                                       4)浏览器在下次访问服务器时,会带着cookie信息

                                                    举例: cookie: name=eric  (隐藏带着一个叫cookie名称的请求头)

                                       5)服务器接收到浏览器带来的cookie信息

                                                         request.getCookies();

                     

                              3.4 Cookie的细节

                              1)void setPath(java.lang.String uri)   :设置cookie的有效访问路径。有效路径指的是cookie的有效路径保存在哪里,那么浏览器在有效路径下访问服务器时就会带着cookie信息,否则不带cookie信息。

                             

                              2)void setMaxAge(int expiry) : 设置cookie的有效时间。

                                                正整数:表示cookie数据保存浏览器的缓存目录(硬盘中),数值表示保存的时间。

                                                负整数:表示cookie数据保存浏览器的内存中。浏览器关闭cookie就丢失了!!

                                                零:表示删除同名的cookie数据

                              3)Cookie数据类型只能保存非中文字符串类型的。可以保存多个cookie,但是浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。

                              3.5 案例- 显示用户上次访问的时间

                              3.6 案例-查看用户浏览器过的商品

    4 Session技术

                              4.1 引入

                              Cookie的局限:

                                       1)Cookie只能存字符串类型。不能保存对象

                                       2)只能存非中文。

                                       3)1个Cookie的容量不超过4KB。

                              如果要保存非字符串,超过4kb内容,只能使用session技术!!!

                              Session特点:

                                                会话数据保存在服务器端。(内存中)

                              4.2 Session技术核心

                              HttpSession类:用于保存会话数据

                               1)创建或得到session对象

                                       HttpSession getSession() 

                                       HttpSession getSession(boolean create) 

                              2)设置session对象

                                       void setMaxInactiveInterval(int interval)  : 设置session的有效时间

                                       void invalidate()     : 销毁session对象

                                       java.lang.String getId()  : 得到session编号

                              3)保存会话数据到session对象

                                       void setAttribute(java.lang.String name, java.lang.Object value)  : 保存数据

                                       java.lang.Object getAttribute(java.lang.String name)  : 获取数据

                                       void removeAttribute(java.lang.String name) : 清除数据

                              4.3 Session原理

                                       问题: 服务器能够识别不同的浏览者!!!

                              现象:

                前提: 在哪个session域对象保存数据,就必须从哪个域对象取出!!!!

                              浏览器1:(给s1分配一个唯一的标记:s001,把s001发送给浏览器)

                                                1)创建session对象,保存会话数据

                                                                  HttpSession session = request.getSession();   --保存会话数据 s1

                              浏览器1 的新窗口(带着s001的标记到服务器查询,s001->s1,返回s1) 

                                                1)得到session对象的会话数据

                                                             HttpSession session = request.getSession();   --可以取出  s1

                              新的浏览器1:(没有带s001,不能返回s1)

                                                1)得到session对象的会话数据

                                                             HttpSession session = request.getSession();   --不可以取出  s2

                              浏览器2:(没有带s001,不能返回s1)

                                                1)得到session对象的会话数据

                                                             HttpSession session = request.getSession();  --不可以取出  s3

                             

                              代码解读:HttpSession session = request.getSession();

                                      

                              1)第一次访问创建session对象,给session对象分配一个唯一的ID,叫JSESSIONID

                                                new HttpSession();

                              2)把JSESSIONID作为Cookie的值发送给浏览器保存

                                                Cookie cookie = new Cookie("JSESSIONID", sessionID);

                                                response.addCookie(cookie);

                              3)第二次访问的时候,浏览器带着JSESSIONID的cookie访问服务器

                              4)服务器得到JSESSIONID,在服务器的内存中搜索是否存放对应编号的session对象。

                                                if(找到){

                                                         return map.get(sessionID);

                                                }

                                                Map<String,HttpSession>]

                                                <"s001", s1>

                                                <"s001,"s2>

                              5)如果找到对应编号的session对象,直接返回该对象

                              6)如果找不到对应编号的session对象,创建新的session对象,继续走1的流程

            

                               结论:通过JSESSION的cookie值在服务器找session对象!!!!!

                              4.4 Sesson细节

                               1)java.lang.String getId()  : 得到session编号

                              2)两个getSession方法:

                                                getSession(true) / getSession()  : 创建或得到session对象。没有匹配的session编号,自动创                                                                                                      建新的session对象。

                                                getSession(false):              得到session对象。没有匹配的session编号,返回null

                               3)void setMaxInactiveInterval(int interval)  : 设置session的有效时间

                                                         session对象销毁时间:

                                                                 3.1 默认情况30分服务器自动回收

                                                                 3.2 修改session回收时间

                                                                 3.3 全局修改session有效时间

                                                                

    <!-- 修改session全局有效时间:分钟 -->
        <session-config>
            <session-timeout>1</session-timeout>
        </session-config>

                                                                  3.4.手动销毁session对象

                                                                           void invalidate()     : 销毁session对象

                              4)如何避免浏览器的JSESSIONID的cookie随着浏览器关闭而丢失的问题

                                               

    /**
             * 手动发送一个硬盘保存的cookie给浏览器
             */
            Cookie c = new Cookie("JSESSIONID",session.getId());
            c.setMaxAge(60*60);
            response.addCookie(c);

    总结:

                                       1)会话管理: 浏览器和服务器会话过程中的产生的会话数据的管理。

                                       2)Cookie技术:

                                                         new Cookie("name","value")

                                                         response.addCookie(coookie)

                                                         request.getCookies()

                                        3)Session技术

                                                         request.getSession();

                                                        

                                                         setAttrbute("name","会话数据");

                                                         getAttribute("会话数据")

    3 编程实战

          通讯录程序

                      软件的生命周期

                      3.1 需求分析(需求分析师)

                                       功能分析:

                                                         1)添加联系人

                                                         2)修改联系人

                                                         3)删除联系人

                                                         4)查询所有联系人

                                       功能流转

                              美工设计: 设计软件的静态原型

                      3.2 需求设计(系统分析师/架构师/资深开发人员)

                                       1)设计实体(抽象实体)

                                                         联系人实体:

                                                                 class Contact{

                                                                          private String id;

                                                                          private String name;

                                                                          private String gender;

                                                                          private int age;

                                                                          private String phone;

                                                                          private String email;

                                                                          private String qq;

                                                                 }

                                       2)设计“数据库”,(xml代替"数据库")

                                                         contact.xml

                                                                 <contactList>

                                                                                   <contact id="1">

                                                                                            <name>张三</name>

                                                                                            <gender>男</gender>

                                                                                            <age>20</age>

                                                                                            <phone>13433334444</phone>

                                                                                            <email>zs@qq.com</email>

                                                                                            <qq>43222222<qq>

                                                                                   </contact>

                                                                 </contactList>

                                 3)设计涉及的接口

                                                         DAO接口(数据访问对象):实体对象的CRUD方法。

                                                         项目原则: 通常一个实体对象就会对应一个DAO接口和一个DAO实现类

                                                         interface ContactDao{

                                                                 public void addContact(Contact contact);//添加联系人

                                                                 public void updateContact(Contact contact);//修改联系人

                                                                 public void deleteContact(String id);//删除联系人

                                                                 public List<Contact> findAll();  //查询所有联系人

                                                                 public Contact findById(String id);//根据编号查询联系人

                                                         }

                                       4)设计项目的目录结构

                                                         项目名称: contactSys_web

                                                         目录结构:

                                                                          |- contactSys_web

                                                                                   |-src

                                                                                            |-gz.itcast.contactSys_web.entity : 存放实体对象

                                                                                            |-gz.itcast.contactSys_web.dao : 存放dao的接口

                                                                                            |-gz.itcast.contactSys_web.dao.impl: 存放dao的实现类

                                                                                            |-gz.itcast.contactSys_web.servlet: 存放servlet的类

                                                                                            |-gz.itcast.contactSys_web.test: 存放单元测试类

                                                                                            |-gz.itcast.contactSys_web.util: 存放工具类

                                                                                            |-gz.itcast.contactSys_web.exception: 存放自定义异常类

                                                                                   |-WebRoot

                                                                                            |-html文件

                                                                                            |-images:目录。存放图片资源

                                                                                            |-css:目录。存放css资源

                                                                                            |-js:目录。存放js资源

                                                                                                            

                      3.3 编码实现(软件开发工程师/攻城狮)

                                       开发顺序:

                                       设计数据库-> 实体 -> DAO接口,DAO实现-> Servlet+html页面

                      3.4 功能测试(测试攻城狮)    

                 3.5 性能测试(测试攻城狮)

                      3.6 部署上线(实施攻城狮)

                      3.7 维护阶段(实施攻城狮)             

            

                     

    author@nohert
  • 相关阅读:
    python class属性
    获取安卓系统日志输出
    深入理解C#中的IDisposable接口(转)
    Mac开启自带的Apache服务器
    【转】《Unity Shader入门精要》冯乐乐著 书中彩图
    AssetDatabase的方法总结
    C# 读写XML文件的方法
    tkinter模块常用参数(python3)
    Unity在Project视图里面显示文件的拓展名
    Git忽略提交规则
  • 原文地址:https://www.cnblogs.com/gzgBlog/p/13812549.html
Copyright © 2011-2022 走看看