Cookie & session (简介)

Cookie & session (简介)

流程控制 : 选择结构&循环结构 目的: 控制程序执行流程

会话控制 : Cookie& Session, 目的 : 控制会话 【即使关闭浏览器 , 也期望会话保留】

Cookie

记忆技巧 :
Cookie由来 【程序员带小女儿去买饼干 - 饼干店搞促销活动】

  1. 程序员带女儿 , 进入饼干店 , 买饼干
  2. 给程序员 , [卡片盖章]…
  3. 以后程序员再来买饼干时 , 会携带卡片…
  4. 店家可以通过卡片, 区分不同的用户 …

1.Cookie 简介

  • 为什么学习Cookie
    • 因为 : Http是无状态协议 : 服务器无法区分不同浏览器 发出请求
    • 通过Cookie , 使的服务器可以区分不同浏览器
  • 作用 : 帮助服务器区分不同的浏览器
  • 总结一句话 : Cookie ,是以键值对的方式存储小量信息的技术 。

2.Cookie 工作原理

  • 浏览器向服务器发送请求
  • 服务器创建Cookie 对象 【卡片】 , Cookie对象中存放用户信息 , 并将Cookie对象发送给浏览器
  • 以后浏览器再次发送请求 , 携带该Cookie对象 。
  • 服务器通过Cookie对象 , 区分不同浏览器 。

3.Cookie使用

  • Cookie创建

    // 1 创建Cookie
    Cookie cookie = new Cookie("level","level1");
    // 2 将Cookie相应给服务器
    response.addCookie(cookie);
    
  • Cookie获取

    // 获取Cookie对象
    Cookie[] cookies = request.getCookie();
    for (Cookie cookie : cookies) {
        if ("level".equals(cookie.getValue())) {
            String Value = cookie.getValue();
        	System.out.println(value);
        }
    }
    
  • Cookie修改

      /* // 1 直接修改Cookie level1 修改为 level2
           Cookie[] cookies = request.getCookies();
           for (Cookie cookie : cookies) {
               if ("level".equals(cookie.getName())) {
                   cookie.setValue("level2");
                   // 响应给浏览器
                   response.addCookie(cookie);
                   break;
               }
           }*/
    
    /*       // 方法二  创建同名的Cookie 覆盖
           Cookie cookie = new Cookie("level", "levle3");
           // 2 响应给浏览器
           response.addCookie(cookie);*/
    
           // 存在中文
           Cookie cookie = new Cookie("level", URLEncoder.encode("黄金","UTF-8"));
           // 将Cookie相应给浏览器
           response.addCookie(cookie);
    
  • Cookie键值问题

    • Cookie的name不能是中文[语法不支持] , Cookie的value支持中文的 , 但使用中文需要处理字符集问题 , 相对比较繁琐 , 所以,一般建议使用英文 .

    • 如Cookie的value中使用中文 , 需要做如下处理

      // 存在中文  编码处理
      Cookie cookie = new Cookie("level", URLEncoder.encode("黄金","UTF-8"));
      // 将Cookie相应给浏览器
      response.addCookie(cookie);
        // 获取Cookie时 , 解码处理
      String value = cookie.getValue();
      System.out.println("value =" + URLDecoder.decode(value,"UTF-8"));
      

4.Cookie的有效型

4.1Cookie有效时间 [持久化Cookie]

Cookie默认会话级别 : 浏览器不关闭且不更换, 【浏览器关闭或更换失效】

  • setMaxAge(ss) : 单位ss是秒 , 数据类型为int

    • ss > 0 : 设置Cookie的最大存活时间ss秒 [ss秒后失效]
    • ss = 0 : 设置Cookie立即失效
    • ss < 0 : 恢复Cookie默认有效时间 [关闭浏览器失效]
  • 代码

    Cookie cookie = new Cookie("stuName", "xiaobai");
    // 持久化Cookie  在20秒后自动销毁
    cookie.setMaxAge(20);
    // 将Cookie响应浏览器
    response.addCookie(cookie);
    
4.2Cookie有效路径
  • 默认Cookie的有效路径为 : / 当前项目名 【上下文路径】

  • 使用setPath() 方法 , 设置Cookie有效路径

    Cookie cookie = new Cookie("stuName", "laoxu");
    // 持久化Cookie
    cookie.setMaxAge(20);
    // 设置Cookie有效路径   
    // 只有在indel.jsp 页面有效
    cookie.setPath(request.getContextPath() + "/index.jsp");
    // 将Cookie响应浏览器
    response.addCookie(cookie);
    

5.Cookie应用

案例 :

  • 实现7天免输入

    <form action="UserServlet?method=login" method="post">
        用户名 : <input id="username" value="${cookie.uname.value}" type="text" name="uname" placeholder="请输入用户名">   <br>
        密码 : <input id="pwd" value="${cookie.pwd.value}" type="password" name="pwd" > <br>
        7天免输入 <input type="checkbox" name="cb" value="cb"> <br>
        <input id="btnSub" type="submit" value="登录">
    </form>
    
    // 1 获取请求参数
    String uname = request.getParameter("uname");
    String pwd = request.getParameter("pwd");
    String cb = request.getParameter("cb");
    // 判断是否选中
    System.out.println("cb = " + cb);
    if (cb != null && !"".equals(cb)) {
        // 2 存储数据  , 并持久化7天 [域 : Session . Cookie]
        Cookie unCookie = new Cookie("uname", uname);
        Cookie pwdCookie = new Cookie("pwd", pwd);
        // 3 持久化7天
        unCookie.setMaxAge(60 * 60 * 24 * 7);
        pwdCookie.setMaxAge(50 * 60 * 24 * 7);
        // 将Cookie 发送给浏览器
        response.addCookie(unCookie);
        response.addCookie(pwdCookie);
        response.getWriter().write("登录成功");
    }
    

6.Cookie缺陷

  • Cookie的value是String 类型 , 存储数据不方便
  • Cookie数量如过多 , 会浪费流量
  • 不同浏览器厂商对Cookie均为有限制 [大小 : 2 - 5kb , 数量 : 200 - 500个左右]

Session

1.Session简介

  • Session是jsp九大内置对象之一
  • Session也是jsp四大域对象之一
  • Session还是会话对象之一

2.Session工作原理 【面试题】

记忆技巧
Cookie由来【当下,程序员带着小女儿去买饼干-饼干店搞促销活动】

  1. 程序员带女儿 , 进入饼干店 , 买饼干
  2. 店家在电脑中注册会员信息【手机号】 , 同时会发送一张卡片给程序员 【卡片:手机号或会员id】
  3. 以后程序员再来买饼干时 , 会携带卡片…
  4. 店家可以通过卡片,在电脑中查询指定的会员信息, 区分不同的用户 …
  • session工作原理

    • 浏览器向服务器【第一次request.getSession()】发送请求

    • @2服务器创建session对象 , 同时会创建一个特殊的Cookie对象

    • 以后浏览器再次发送请求 , 会携带Cookie【Cookie的name是固定值 : JSEESIONID , Cookie的value是Session的id】 , 并将Cookie发送给浏览器

    • 服务器通过Cookie , 找到相应的session对象, 从而区分不同的浏览器

      Session工作原理 【扩展版本】

      浏览器不是第一次发送请求 [不是第一次request.getSession()]

      ​ 服务器优先获取已创建Session对象 [不一定能获取到]

      ​ 判断特殊Cookie【name=JSESSIONID】 是否存在

      ​ 存在 : 需要判断Session对象 , 是否存活【Session默认存活30分钟】

      ​ Session对象存在 : 获取已存在Session , 直接使用即可

      ​ Session对象不存在 : 返回@2 步骤 , 重新创建Session

      ​ 不存在: 无法找到Session , 此时需要使用Session , 返回@2步骤, 重新创建Session .

3.Session使用

  • session创建

    • 第一次调用request.getSession()时,服务器创建Session对象。【以后再次使用Session对象,会获取已创建Session】

      在jsp中本质也是调用(HttpServletRequest)request.getSession()时,创建Session对象

  • session获取

    • jsp : 直接使用 : [session是jsp 内置对象之一]
    • html->Servlet:request.getSession()
  • session修改

    • session.setAttribute(String key,Object value);
    • Object session.getAttribute(String key);
    • session.removeAttribute(String key);

4.Session的有效时间

默认Session存活30分钟

因为Tomcat - > conf -> web.xml 中 , 有如下配置

<!--    Default Session Config-->
 <session-config>
     <session-timeout>30</session-timeout>
 </session-config>
4.1设置session空闲时间 [非活动时间]
  • 全局配置 : 在项目的web.xml 中配置

    <!--    设置所有Session的非活动【空闲】时间为1分钟,数据类型为:int,单位分钟-->
        <session-config>
            <session-timeout>1</session-timeout>
        </session-config>
    
  • 局部配置 : 使用session.setMaxInactiveInterval( int seconds)

    • ss > 0 :设置当前session对象的最大空闲时间为 ss秒
    • ss<=0:永不失效
4.2持久化Session [重点]
  • 思路 :

    • 先持久化 特殊Cookie 【name=JSESSIONID】
    • 在持久化Session对象【如持久化时间<=30分钟,该步骤可省略】
  • 代码

    // 1 先持久化Cookie  20秒
    Cookie[] cookies = request.getCookies();
    for (Cookie cookie : cookies) {
        if ("JSESSIONID".equals(cookie.getName())) {
            cookie.setMaxAge(10);
            response.addCookie(cookie);
            break;
        }
    }
    // 在持久化session  
    request.getSession().setMaxInactiveInterval(20);
    

5.销毁Session对象

  • Session对象空闲时间达到了目标设置的最大值, 自动释放

  • Session对象被强制失效

    session.invalidate();
    
  • web应用卸载

  • 服务器进程停止

6.Session的钝化和活化

Session由服务器创建

会话:与浏览器有关,与服务器无关

  • Session钝化:Session在一段时间内没有被使用或关闭服务器时,会将当前存在的Session对象及Session对象中的数据从内存序列化到磁盘的过程,称之为钝化。

  • Session活化:Session被钝化后,服务器再次调用Session对象或重启服务器时,将Session对象及Session对象中的数据从磁盘反序列化到内存的过程,称之为活化。

  • 总结:如需将Session对象中的数据,一同序列化和反序列化。【数据必须支持序列化】

    public class Student implements Serializable {
    
    
        private static final long serialVersionUID = 4813853420539578803L;
        private Integer id;
        private String name;
        
        ...
        }
    

7.解决表单重复提交

  • 表单重复提交的危害
    • 可重复注册,对数据库进行批处理攻击。(验证码已解决该问题)
    • 可重复提交已付款表单,用户支付一次订单费用,下了多个订单
    • 等待…
  • 解决表单重复提交的步骤
    • 生成一个不可重复(全球唯一)的随机数(uuid)
    • 在提交表单前,将随机数(uuid)分别存放到表单内的隐藏域,和session域对象中
    • 发送“提交表单”请求
    • 判断是否提交表单,具体操作如下:
      • 分别获取隐藏域和session域中的uuid
      • 判断两个域中的数据是否相等
        • 相等:提交表单,并将session域中的uuid移除
        • 不等:不提交表单
  • UUID
    • 定义:是一个32位16进制的随机数
    • 特点:全球唯一
    • 使用:java.util.UUID.randomUUID()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容越多,也需要更多的人来对数据进行整理,并且数据的汇总查询方面效率也是极其的低下,并且数据安全方面永远不会保证安全性能。结合数据内容管理的种种缺点,在互联网时代都可以得到有效的补充。结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总分析的及时性,都能让正确率达到最高,管理更加的科学和便捷。本次开发的医院后台管理系统实现了病房管理、病例管理、处方管理、字典管理、公告信息管理、患者管理、药品管理、医生管理、预约医生管理、住院管理、管理员管理等功能。系统用到了关系型数据库中王者MySql作为系统的数据库,有效的对数据进行安全的存储,有效的备份,对数据可靠性方面得到了保证。并且程序也具备程序需求的所有功能,使得操作性还是安全性都大大提高,让医院后台管理系统更能从理念走到现实,确确实实的让人们提升信息处理效率。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值