09.会话控制

09.会话控制

一、简介

  • 由于HTTP协议是一个纯文本、无状态的协议。无状态:服务器不知道多个请求来自于那些用户。但是我们有时候有这样的需求,需要让服务器知道多个请求来自于同一个用户,例如购物,所以就有了会话控制。
  • 会话控制中包含两种技术:Cookie和Session

二、Cookie

  • Cookie是由服务器创建的用来区分不同用户的对象
  • Cookie的运行原理
    • 1)第一次向服务器发送请求时在服务器端创建一个Cookie对象
    • 2)将Cookie对象发送给浏览器
    • 3)以后再发送请求就携带着该Cookie对象
    • 4)服务器根据不同的Cookie对象区分不同的用户
  • 创建Cookie
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.创建Cookie对象
        /*
            注意:在创建Cookie对象时,Cookie对象的名字不能使用汉字,Cookie对象的值可以使用汉字,但是
                需要指定字符集进行编码,然后获取的时候还需要指定字符集进行解码,所以建议不使用中文
         */
        Cookie cookie = new Cookie("user", "admin");
        Cookie cookie2 = new Cookie("user2", "admin2");
        //2.将Cookie对象发送给浏览器
        response.addCookie(cookie);
        response.addCookie(cookie2);
    }
  • 获取Cookie
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取所有的Cookie对象
        Cookie[] cookies = request.getCookies();
        if(cookies != null){
            //遍历得到每一个Cookie对象
            for (Cookie cookie : cookies) {
                //获取Cookie对象的名字
                String name = cookie.getName();
                //获取Cookie对象的值
                String value = cookie.getValue();
                System.out.println("Cookie的对象的名字是:"+name);
                System.out.println("Cookie的对象的值是:"+value);
            }
        }
    }
  • 修改Cookie
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取Cookie对象
        Cookie[] cookies = request.getCookies();
        if(cookies != null){
            for (Cookie cookie : cookies) {
                //获取Cookie的名字
                String name = cookie.getName();
                //将名字是user的Cookie对象的值修改为SuperAdmin
                if("user".equals(name)){
                    //修改该Cookie对象的值
                    cookie.setValue("SuperAdmin");
                    //将修改之后的Cookie对象发送给浏览器
                    response.addCookie(cookie);
                }
            }
        }
    }
  • 设置Cookie对象的有效时间
    • Cookie对象默认是会话级别的,关闭浏览器之后Cookie对象就失效,我们可以通过setMaxAge方法设置Cookie对象的有效时间
 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //创建一个Cookie对象
        Cookie cookie = new Cookie("user3", "persisCookie");
        /*
            设置Cookie对象的有效时间
                setMaxAge(int age)
                    age>0:Cookie对象在age秒后失效
                    age=0:Cookie对象立即失效
                    age<0:默认,会话级别的Cookie对象
         */
        cookie.setMaxAge(-1);
        //将Cookie对象发送给浏览器
        response.addCookie(cookie);
    }
  • Cookie的用途
    • 1)广告推荐
    • 2)免登录
  • Cookie的缺陷
    • 1)Cookie是明文的,不安全
    • 2)不同的浏览器对Cookie大小和数量有限制
    • 3)Cookie对象只能保存String类型的值
    • 所以就有了Session

三、Session

  • Session即HttpSession,用来保存用户信息

  • Session的运行原理

    • 1)第一次向服务器发送请求时在服务器端创建Session对象,该对象有一个全球唯一的ID。在创建Session对象的同时会创建一个特殊的Cookie对象,该Coookie对象的名字是JSESSIONID,该Cookie对象的值就是Session对象的ID值
    • 2)将这个特殊的Cookie对象发送给浏览器
    • 3)以后再发送请求就会携带着这个特殊的Cookie对象
    • 4)服务器获取Cookie对象的value值后寻找与之对应的Session对象,因为Session对象中保存中用户信息,所以以此就可以区分不同的用户
  • 创建Session对象和获取Session对象

    • 如果项目中都是HTML页面,需要在Servlet中通过request.getSession()创建Session对象
    HttpSession session = request.getSession();
    
    • 如果项目中是Jsp页面,那么一访问Jsp页面Session对象就被创建,此时再通过Servlet的request调用getSession()方法获取的就是访问index.jsp页面创建Session对象
    • 在一次会话中,只能使用一个Session对象
  • 设置名字为JSESSIONID的Cookie对象的有效时间

    • 由于Cookie对象默认是会话级别的,关闭浏览器之后Cookie对象将失效,再次打开浏览器将不再携带原来的名字为JSESSIONID的Cookie对象,也就无法无法获取服务器中对应的Session对象,就无法获取Session中保存的用户信息
    • 我们可以通过设置名字为JSESSIONID的Cookie对象的有效时间达到获取Session中的用户信息的目的
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //获取Cookie对象
            Cookie[] cookies = request.getCookies();
            if(cookies != null){
                for (Cookie cookie : cookies) {
                    //获取Cookie的名字
                    String name = cookie.getName();
                    //判断是否是JSESIONID的Cookie对象
                    if("JSESSIONID".equals(name)){
                        //设置该Cookie对象的有效时间
                        cookie.setMaxAge(120);
                        //将Cookie对象发送给浏览器
                        response.addCookie(cookie);
                    }
                }
            }
        }
    
  • 设置Session对象的最大空闲时间

    • Session对象的最大空闲时间使30分钟,在Tomcat的web.xml中有对应的配置
    <!-- ==================== Default Session Configuration ================= -->
      <!-- You can set the default session timeout (in minutes) for all newly   -->
      <!-- created sessions by modifying the value below.                       -->
    
        <session-config>
            <session-timeout>30</session-timeout>
        </session-config>
    
    • 我们也可以通过调用setMaxInactiveInterval()方法设置Session对象的最大空闲时间
     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //获取Session对象
            HttpSession session = request.getSession();
            /*
                设置Session对象的最大空闲时间
                    setMaxInactiveInterval(int age)
                        age>0:Session对象空闲age秒后失效
                        age<=0:Session对象永远不失效
             */
    //        session.setMaxInactiveInterval(30);
            //通过以下方式使Session对象立即失效
            session.invalidate();
        }
    
  • 钝化和活化

    • 钝化
      • Session与session中保存的对象一起从内存序列化到硬盘的过程称为钝化
      • 关闭服务器时会发生钝化的现象
    • 活化
      • Session与session中保存的对象一起从硬盘反序列化到内存的过程称为活化
      • 重新启动服务器时会发生活化的现象
    • Session中的对象要想正常的钝化和活化,对应的类以及类中的属性类型都需要实现序列化接口
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值