会话Cookie&&Session

目录

一 Cookie技术

1 Cookie的概念

2 Cookie的作用

3 Cookie的应用场景

4 Cookie的入门案例

5 Cookie的时效性

6 Cookie的path

二 Session技术

1 session概述

2 Session的入门案例

3 Session的工作机制

4 Session的时效性


一 Cookie技术

1 Cookie的概念

        Cookie是一种客户端的会话技术,它是服务器存放在浏览器的一小份数据,浏览器以后每次访问该服务器的时候都会将这小份数据携带到服务器去。

2 Cookie的作用

  1. 在浏览器中存放数据

  2. 将浏览器中存放的数据携带到服务器

3 Cookie的应用场景

        1.记住用户名

        当我们在用户名的输入框中输入完用户名后,浏览器记录用户名,下一次再访问登录页面时,用户名自动填充到用户名的输入框.

        2.保存电影的播放进度

        在网页上播放电影的时候,如果中途退出浏览器了,下载再打开浏览器播放同一部电影的时候,会自动跳转到上次退出时候的进度,因为在播放的时候会将播放进度保存到cookie中

4 Cookie的入门案例

① 目标

实现在ServletDemo01和ServletDemo02之间共享数据,要求在会话域范围内共享

② Cookie相关的API

  • 创建一个Cookie对象(cookie只能保存字符串数据。且不能保存中文)

new Cookie(String name,String value);
  • 把cookie写回浏览器

response.addCookie(cookie); 
  • 获得浏览器带过来的所有Cookie:

request.getCookies() ; //得到所有的cookie对象。是一个数组,开发中根据key得到目标cookie
  • cookie的 API

cookie.getName() ; //返回cookie中设置的key
cookie.getValue(); //返回cookie中设置的value

③ ServletDemo01代码

在ServletDemo01中创建Cookie数据并响应给客户端

public class ServletDemo01 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1. 创建一个cookie对象,用于存放键值对
        Cookie cookie = new Cookie("cookie-message","hello-cookie");

        //2. 将cookie添加到response中
        //底层是通过一个名为"Set-Cookie"的响应头携带到浏览器的
        response.addCookie(cookie);
    }
}

 

④ 浏览器发送请求携带Cookie

这里不需要我们操作,浏览器会在给服务器发送请求的时候,将cookie通过请求头自动携带到服务器

 

 ⑤ ServletDemo02获取Cookie数据的代码

public class ServletDemo02 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1. 从请求中取出cookie
        //底层是由名为"Cookie"的请求头携带的
        Cookie[] cookies = request.getCookies();

        //2. 遍历出每一个cookie
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                //匹配cookie的name
                if (cookie.getName().equals("cookie-message")) {
                    //它就是我们想要的那个cookie
                    //我们就获取它的value
                    String value = cookie.getValue();
                    System.out.println("在ServletDemo02中获取str的值为:" + value);
                }
            }
        }
    }
}

5 Cookie的时效性

如果我们不设置Cookie的时效性,默认情况下Cookie的有效期是一次会话范围内,我们可以通过cookie的setMaxAge()方法让Cookie持久化保存到浏览器上

  • 会话级Cookie

    • 服务器端并没有明确指定Cookie的存在时间

    • 在浏览器端,Cookie数据存在于内存中

    • 只要浏览器还开着,Cookie数据就一直都在

    • 浏览器关闭,内存中的Cookie数据就会被释放

  • 持久化Cookie

    • 服务器端明确设置了Cookie的存在时间

    • 在浏览器端,Cookie数据会被保存到硬盘上

    • Cookie在硬盘上存在的时间根据服务器端限定的时间来管控,不受浏览器关闭的影响

    • 持久化Cookie到达了预设的时间会被释放

cookie.setMaxAge(int expiry)参数单位是秒,表示cookie的持久化时间,如果设置参数为0,表示将浏览器中保存的该cookie删除

6 Cookie的path

上网时间长了,本地会保存很多Cookie。对浏览器来说,访问互联网资源时不能每次都把所有Cookie带上。浏览器会使用Cookie的path属性值来和当前访问的地址进行比较,从而决定是否携带这个Cookie。

我们可以通过调用cookie的setPath()方法来设置cookie的path

二 Session技术

1 session概述

        session是服务器端的技术。服务器为每一个浏览器开辟一块内存空间,即session对象。由于session对象是每一个浏览器特有的,所以用户的记录可以存放在session对象中

2 Session的入门案例

① 目标

实现在ServletDemo01和ServletDemo02之间共享数据,要求在会话域范围内共享

② Session的API介绍

  • request.getSession(); 获得session(如果第一次调用的时候其实是创建session,第一次之后通过sessionId找到session进行使用)

  • Object getAttribute(String name) ;获取值

  • void setAttribute(String name, Object value) ;存储值

  • void removeAttribute(String name) ;移除值

③ 在ServletDemo01中往Session域对象存储数据

public class ServletDemo01 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1. 获取Session对象
        HttpSession session = request.getSession();
        //2. 往Session对象中存入数据
        session.setAttribute("session-message","hello-session");
    }
}

 ④ 在ServletDemo02中从Session域对象中获取数据

public class ServletDemo02 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1. 获取Session对象
        HttpSession session = request.getSession();
        //2. 往Session对象中存入数据
        String message = (String)session.getAttribute("session-message");
        System.out.println(message);
    }
}

3 Session的工作机制

前提:浏览器正常访问服务器

  • 服务器端没调用request.getSession()方法:什么都不会发生

  • 服务器端调用了request.getSession()方法

    • 服务器端检查当前请求中是否携带了JSESSIONID的Cookie

      • 有:根据JSESSIONID在服务器端查找对应的HttpSession对象

        • 能找到:将找到的HttpSession对象作为request.getSession()方法的返回值返回

        • 找不到:服务器端新建一个HttpSession对象作为request.getSession()方法的返回值返回

      • 无:服务器端新建一个HttpSession对象作为request.getSession()方法的返回值返回

// 1.调用request对象的方法尝试获取HttpSession对象
HttpSession session = request.getSession();

// 2.调用HttpSession对象的isNew()方法
boolean wetherNew = session.isNew();

// 3.打印HttpSession对象是否为新对象
System.out.println("wetherNew = " + wetherNew+"HttpSession对象是新的":"HttpSession对象是旧的"));

// 4.调用HttpSession对象的getId()方法
String id = session.getId();

// 5.打印JSESSIONID的值
System.out.println("JSESSIONID = " + id);

4 Session的时效性

① 为什么Session要设置时限

用户量很大之后,Session对象相应的也要创建很多。如果一味创建不释放,那么服务器端的内存迟早要被耗尽。

② 设置时限的难点

从服务器端的角度,很难精确得知类似浏览器关闭的动作。而且即使浏览器一直没有关闭,也不代表用户仍然在使用。

③ 服务器端给Session对象设置最大闲置时间

  • 默认值:1800秒

最大闲置时间生效的机制如下:

// ※测试时效性
// 获取默认的最大闲置时间
int maxInactiveIntervalSecond = session.getMaxInactiveInterval();
System.out.println("maxInactiveIntervalSecond = " + maxInactiveIntervalSecond);

// 设置默认的最大闲置时间
session.setMaxInactiveInterval(15);

 ⑤ 强制Session立即失效

session.invalidate();

猜你喜欢

转载自blog.csdn.net/rbx508780/article/details/127495858