2.3.4 Cookie & Session 三大域, request, session, servletContext, 操作API, 创建销毁时机, 作用范围

目录

一 会话概述

1.1 什么是会话?

1.2 会话技术

二 Cookie【重点】

2.1 概述

2.2 快速入门

2.3 工作原理

2.4 Cookie细节

2.4.1 服务器发送多个Cookie?

2.4.2 Cookie在浏览器保存时间?

2.4.3 Cookie是否可以存储中文?

2.5 Cookie特点

三 Session【重点】

3.1 概述

3.2 快速入门

3.3 工作原理

3.4 生命周期

四  三大域对象总结

4.1 API

4.2 生命周期

4.3 小结



一 会话概述

1.1 什么是会话?

日常生活中:从拨通电话到挂断电话之间的一连串你问我答的过程就是一个会话。
B/S架构中:从浏览器第一次给服务器发送请求时,建立会话;直到有一方断开,会话结束。
一次会话:包含多次请求响应。

1.2 会话技术

问题:Http是一个无状态协议,同一个会话的连续两个请求相互独立,彼此并不了解
作用:用于==存储==浏览器与服务器在请求和响应过程中产生的==数据==
客户端会话技术:cookie
服务器端会话技术:session

二 Cookie【重点】

2.1 概述

Cookie作用:在一次会话的多次请求之间共享数据,将数据保存到客户端(浏览器)
jd购物车

2.2 快速入门

public class SetServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1.创建cookie对象,设置数据
        Cookie cookie = new Cookie("name","jack");
        // 2.通过response,响应(返回)cookie
        response.addCookie(cookie);
    }
}

public class GetServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        req.setCharacterEncoding("UTF-8");
        // 1. 通过request对象,获取到携带的所有cookie
        Cookie[] cookies = req.getCookies();

        // 2. 遍历数组
        if(cookies !=null ){
            for (Cookie cookie : cookies) {
                // 获取的就是cookie的name值
                String name = cookie.getName();
                // 获取cookie的value值
                String value = cookie.getValue();
                System.out.println(name + "----" + value );
            }
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
<servlet>
        <servlet-name>GetServlet</servlet-name>
        <servlet-class>com.lagou.servlet.GetServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>GetServlet</servlet-name>
        <url-pattern>/getServlet</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>SetServlet</servlet-name>
        <servlet-class>com.lagou.servlet.SetServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SetServlet</servlet-name>
        <url-pattern>/setServlet</url-pattern>
    </servlet-mapping>

2.3 工作原理

基于HTTP协议:请求头cookie 和 响应头 set-cookie

2.4 Cookie细节

2.4.1 服务器发送多个Cookie?

public class SetServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // 1. 创建cookie对象,设置数据
        Cookie cookie1 = new Cookie("name", "jack");
        Cookie cookie2 = new Cookie("age", "18");

        // 2. 通过response对象响应cookie
        resp.addCookie(cookie1);
        resp.addCookie(cookie2);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

2.4.2 Cookie在浏览器保存时间?


public class MaxAgeCookie extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // 1. 创建cookie对象,设置数据
        Cookie cookie1 = new Cookie("name", "jack");
        // 设置cookie的存活时间
        // -1 浏览器关闭,cookie就销毁
        // cookie1.setMaxAge(-1);
        // 正数 存活60秒,过期销毁
        // cookie1.setMaxAge(60*10);
        // 0 立即销毁
        cookie1.setMaxAge(0);

        // 2. 通过response对象响应cookie
        resp.addCookie(cookie1);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
<servlet>
        <servlet-name>MaxAgeCookie</servlet-name>
        <servlet-class>com.lagou.servlet.MaxAgeCookie</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>MaxAgeCookie</servlet-name>
        <url-pattern>/maxAgeCookie</url-pattern>
    </servlet-mapping>

2.4.3 Cookie是否可以存储中文?


public class SetServlet extends HttpServlet {


    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // 1. 创建cookie对象,设置数据
        String encodevalue = URLEncoder.encode("杰克 ", "UTF-8");
        cookie1 = new Cookie("name", encodevalue);
        Cookie cookie2 = new Cookie("age", "18");

        // 2. 通过response对象响应cookie
        resp.addCookie(cookie1);
        resp.addCookie(cookie2);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

public class GetServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        req.setCharacterEncoding("UTF-8");
        // 1. 通过request对象,获取到携带的所有cookie
        Cookie[] cookies = req.getCookies();

        // 2. 遍历数组
        if(cookies !=null ){
            for (Cookie cookie : cookies) {
                // 获取的就是cookie的name值
                String name = cookie.getName();

                // 获取cookie的value值
                String decodevalue = URLDecoder.decode(value, "UTF-8");

                System.out.println(name + "----" + decodevalue);
            }
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

2.5 Cookie特点

三 Session【重点】

3.1 概述

使用Cookie问题
        1. 最多存储4K字符串
        2. 存储数据不太安全
session作用:在一次会话的多次请求之间共享数据,将数据保存到服务器端

3.2 快速入门

HttpSession也是一个域对象

步骤分析
1. 将数据存储到session中
    // 1.通过rquest对象,获取session对象

        HttpSession session = request.getSession();
    // 2.操作session的API,存储数据
        session.setAttribute("username","哈哈,呵呵");

2. 从session中获取数据
    // 1.通过rquest对象,获取session对象

        HttpSession session = request.getSession();
    // 2.操作session的API,获取数据
        session.getAttribute("username");


public class SetSession extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // 将需要共享的数据存到session中
         // 1.获取到session对象
        HttpSession session = req.getSession();
         // 2.通过session对象进行数据存入
        session.setAttribute("name","哈哈,呵呵");
        System.out.println("当前已将共享数据存到session中.....");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

public class GetSession extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // 将session中的共享数据取出来
        // 1.获取session对象
        HttpSession session = req.getSession();
        // 2.获取共享数据
        String name = (String) session.getAttribute("name");
        System.out.println(name);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

3.3 工作原理

Session基于Cookie技术实现

3.4 生命周期

四  三大域对象总结

request、session、ServletContext

4.1 API

4.2 生命周期

  何时创建 何时销毁 作用范围
ServletContext

服务器正常启动,

项目加载时创建

服务器关闭或

项目卸载时销毁

整个web项目

(共享数据)

HttpSession

用户第一次调用request.getSession()

方法时创建

服务器非正常关闭
未活跃状态30分钟
自杀

一次会话中,多次请求

(共享数据)

HttpServletRequest 用户发送请求时创建

服务器响应后销毁

一次请求中,多次转发

(共享数据)

4.3 小结

能用小的不用大的:

        request<session<servletContext

常用的场景:
    request:一次查询的结果(servlet转发jsp)   

    session:存放当前会话的私有数据
        用户登录状态
        验证码用户登录状态
        购物车

    servletContext:  若需要所有的servlet都能访问到,才使用这个域对象.

猜你喜欢

转载自blog.csdn.net/chengh1993/article/details/109861182