Cookie和Session会话技术详解,以及他们两的区别

发布于:2022-12-25 ⋅ 阅读:(510) ⋅ 点赞:(0)

cookie&session&jsp会话技术

1. 目标

  • 理解会话的概念,知道有哪些会话技术

2. 路径

  1. 会话的概念
  2. 为什么要使用会话技术
  3. 常用的会话技术

3. 讲解

3.1会话的概念

​ 用户打开浏览器,浏览不同的网页(资源),发出多个请求,直到关闭浏览器的过程,称为一次会话(多次请求). 如同打电话.

​ 我们在会话的过程(多次请求)之中,用户可能会产生一些数据,这些数据话有的需要保存起来的,我们就可以通过会话技术保存用户各自的数据

3.2为什么要使用会话技术

​ 保存一次通话过程中的数据!

​ 会话技术中数据的保存方式:

​ 浏览器存储会话数据:cookie

​ 服务器存储会话数据:session

3.3常用的会话技术

3.3.1cookie(记住用户名密码)

cookie是客户端(浏览器)的技术,用户浏览的信息以键值对(key=value)的形式保存在浏览器上。如果没有关闭浏览器,再次访问服务器,会把cookie带到服务端,服务端就可以做响应的处理。

3.3.2session(记住登录用户名 购物车)

​ ==session是服务器端的技术。==服务器为每一个浏览器开辟一块内存空间,即session。由于内存空间是每一个浏览器独享的,所有用户在访问的时候,可以把信息保存在session对象中。同时,每一个session对象都对应一个sessionId,服务器把sessionId写到cookie中,再次访问的时候,浏览器会把cookie(sessionId)带过来,找到对应的session对象。

4. 小结

  1. 会话概念
    1. 会话就相当于一次通话,表示从浏览器和服务器的一次通话过程【多次请求和响应】
    2. 会话建立:打开浏览器第一次请求服务器
    3. 会话结束:直到浏览器和服务器有一方关闭
  2. 为什么要使用会话技术?
    1. 要保持一次会话中的重要数据
    2. 客户端会话技术:cookie 表示将数据保存在浏览器
    3. 服务端会话技术:session 表示将数据保存在服务器

第二章-Cookie

知识点-Cookie的概念和作用

1. 目标

  • 理解会话cookie概念以及Cookie的应用场景

2. 路径

  1. Cookie的概念
  2. Cookie的作用
  3. Cookie的应用场景

3. 讲解

3.1 Cookie的概念

​ cookie:客户端的会话技术,保存数据在浏览器!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e9siExcW-1662553434927)(img/tu_2.png)]

​ cookie:一个名称和一个值 一些可选属性 cookie存储的数据大小和个数都有限

​ cookie写入:response.addCookie() 将cookie从服务器 写入到浏览器

​ cookie获取:request.getCookies()

在这里插入图片描述
入门代码:

@WebServlet("/cookie01")
public class CookieServlet01 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("CookieServlet01...");
        //设置cookie  响应给客户端浏览器
        //1.创建Cookie对象
        Cookie cookie = new Cookie("name", "shuaige");
        //2.使用response将cookie输出到客户端浏览器
        response.addCookie(cookie);
    }

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

cookie工具类抽取

package com.itheima.utils;

import javax.servlet.http.Cookie;

public class CookieUtils {

    //根据cookie的name获取cookie的value
    public static String getCookieValue(Cookie[] cookies,String name){
        //如果cookies数组 为null 或者 cookie的name为null或空串 直接返回null
        if (cookies==null || name==null || name.equals("")){
            return null;
        }
        for (Cookie cookie : cookies) {
            if(cookie.getName().equals(name)){
                return cookie.getValue();
            }
        }
        return null;
    }
}这里插入代码片
  1. cookie的特点
    1. cookie是一门客户端会话技术,保存数据在客户端浏览器
    2. cookie在第一次请求时没有,通过服务器以响应头的方式写给浏览器,在浏览器第二次发送 请求时,就会携带cookie到服务器
    3. cookie存储的字符串数据
    4. cookie存储的大小以及个数有限
    5. cookie存储数据不安全 因此cookie会存储一些私人数据或不重要的数据
  2. cookie使用的API
    1. 创建Cookie对象:Cookie cookie = new Cookie(String name,String value);
    2. cookie写入:response.addCookie(cookie);
    3. cookie获取:Cookie[] cookies = request.getCookies();
    4. 获取cookie名称:cookie.getName();
    5. 获取cookie值:cookie.getValue();

3.1cookie的分类

  • 会话级别cookie

​ 在默认的情况下,当浏览器进程结束(浏览器关闭,会话结束)的时候,cookie就会消失。

  • 持久性cookie

    ​ 给cookie设置有效期.cookie.setMaxAge(int expiry) :时间是秒

    ​ -1:默认 会话级别。代表Cookie数据存到浏览器关闭(保存在浏览器文件中)。

        正整数:以秒为单位保存数据有有效时间(把缓存数据保存到磁盘中)    
    

    ​ 0:代表删除Cookie.如果要删除Cookie要确保路径一致

@WebServlet("/cookie03")
public class CookieServlet03 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("CookieServlet03...");
        //设置cookie  响应给客户端浏览器
        //1.创建Cookie对象
        Cookie cookie = new Cookie("name", "shuaige");

        //设置cookie的有效时间  -1:默认会话级别,浏览器一关闭cookie消失  0:删除cookie
        //cookie.setMaxAge(60*2);
        cookie.setMaxAge(0);

        //2.使用response将cookie输出到客户端浏览器
        response.addCookie(cookie);
    }

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

4.小结

  1. Cookie的有效时长:cookie.setMaxAge(int seconds)
    1. -1:默认值,表示会话级别 浏览器一关闭则cookie删除
    2. 0:删除cookie
    3. 正整数:表示cookie的有效时间 单位是秒
  2. cookie的有效路径:cookie.setPath(String path);
    1. 不同路径下的cookie名称可以一样
    2. cookie默认路径是当前Servlet所在资源路径
    3. cookie有效路径一般设置为当前项目的虚拟路径:setPath(request.getContextPath());
    4. cookie存储设置路径,在其路径同级目录和子目录下都可以访问到该cookie
  3. cookie存储中文及特殊字符
    1. tomcat已经解决了cookie中文存储,但是仍然不能存储特殊字符,比如空格…
    2. 存储时编码:URLEncoder.encode(value,“UTF-8”);
    3. 获取时解码:URLDecoder.decode(value,“UTF-8”);
  4. cookie可以一次存储多个

案列:

​ 在访问一个资源的时候,展示上次访问的时间

​ 若是第一次访问则展示:你是第一次访问,若不是第一次则展示:你上次访问的时间是:xxxx

package com.itheima.web.cookie;

import com.itheima.utils.CookieUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;

@WebServlet("/rem")
public class RememberServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //请求响应中文乱码处理
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        Cookie[] cookies = request.getCookies();
        //1.根据cookie的name【lastTime】获取上次访问时间
        String lastTime = CookieUtils.getCookieValue(cookies, "lastTime");
        //2.判断value
        if(lastTime==null){
            //3.1:value==null:第一次访问       
            //获取当前时间,记录在cookie中,写入到浏览器     
            String dateStr = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
            Cookie cookie = new Cookie("lastTime", URLEncoder.encode(dateStr,"UTF-8"));
            response.addCookie(cookie);
            //响应浏览器  用户 你是第一次访问
            response.getWriter().print("你是第一次访问!");
        }else{
            //3.2:value!=null:显示上次访问时间       
            //获取当前时间,记录在cookie中,写入到浏览器 
            String dateStr = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
            Cookie cookie = new Cookie("lastTime", URLEncoder.encode(dateStr,"UTF-8"));
            response.addCookie(cookie);
            //响应浏览器 用户  你上次访问的时间
            response.getWriter().print("你上次访问时间是:"+ URLDecoder.decode(lastTime,"UTF-8"));
        }

    }

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

3.1session概述

session是服务器端的会话技术,用于保存数据在请求间实现数据共享。

​ session是服务器端的会话技术。服务器为每一个浏览器开辟一块内存空间,即session对象。由于session对象是每一个浏览器特有的,所以用户的记录可以存放在session对象中。同时,每一个session对象都对应一个sessionId,服务器把sessionId写到cookie中,再次访问的时候,浏览器把sessionId带过来,找到对应的session对象

3.2cookie和Session的不同

  • Session将数据保存在服务器端,cookie将数据保存在客户端浏览器
  • session一般保存比较重要的数据,cookie保存的相对不重要比较私人的数据
  • session存储的是对象Object,cookie存储的是字符串数据
  • session在数据的存储上没有限制,cookie存储数据量大小以及个数都有限制
  • session是基于cookie实现的

3.3Session的执行原理

​ 1、获得cookie中传递过来的SessionId(cookie)(浏览器请求服务器会将该项目路径下的cookie带过去)

​ 2、如果Cookie中没有sessionid,则创建session对象(第一次调用request.getSession()创建Session对象

​ 3、如果Cookie中有sessionid,找指定的session对象

​ 如果有sessionid并且session对象存在,则直接使用

如果有sessionid,但session对象销毁了,则执行第二步

注意:

  1. 第一次调用request.getSession()才会创建session对象,不调用则session对象不存在
  2. session对象的生命周期范围就是从第一次调用request.getSession(),session对象被创建,当关闭浏览器,session对象被持久化到硬盘
  3. session对象在创建时,会自动产生sessionId,由服务器通过cookie方式写入到浏览器缓存中,该cookie的name是JSESSIONID

4.小结

​ session:服务器端会话技术,保存数据在服务器内存中。

​ cookie和session的区别:

		1. cookie存储会话数据在客户端浏览器,session存储数据在服务器
		2. cookie存储的是字符串数据,session存储的是Object对象
		3. cookie存储的数据量大小和个数有限,session没有限制
		4. cookie一般存储不重要的数据,session存储重要数据
		5. session基于Cookie实现的

​ session工作原理:

1. 第一次请求,通过request.getSession()创建session对象
2. 创建完session对象时,会生成sessionId,保存到cookie中响应给客户端浏览器
3. 第二次请求时,客户端浏览器会携带sessionId到服务器,服务器就根据sessionId找到对应的session对象使用	

5.讲解

​ ServletContext:整个应用

​ request:一次请求

​ Session使用:作为域对象存储数据使用

范围: 一次会话(多次请求) 保存用户各自的数据(以浏览器为单位)

  • request.getSession(); 获得session(如果第一次调用的时候其实是创建session,第一次之后通过sessionId找到session进行使用)
  • Object getAttribute(String name) ;获取值
  • void setAttribute(String name, Object value) ;存储值
  • void removeAttribute(String name) ;移除

session有效期

方式一:tomcat设置session失效时间,默认30min

conf/web.xml

方式二:设置失效时间 setMaxInactiveInterval(); 单位是秒

方式三:手动设置失效 invalidate();

@WebServlet("/session03")
public class SessionServlet03 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        System.out.println("SessionServlet03...");
        //获取session中的共享数据
        HttpSession session = request.getSession();

        //设置session失效
        //方式二:设置失效时间 单位是秒 正数表示有效时间  负数表示永远不会过时
        //session.setMaxInactiveInterval(20);
        //方式三:手动设置失效 立即失效
        session.invalidate();
    }

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

session持久化

  1. 浏览器关闭,会话结束,此时session对象有没有被销毁?没有
    session对象虽然还存在,但是找不到了!因为新打开浏览器发起请求,产生了一个新的sessionId,找不到 原来的session对象了。

    /**
     * 使用cookie持久化session
     */
    @WebServlet("/session04")
    public class SessionServlet04 extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            System.out.println("SessionServlet01...");
    
            //使用Session共享数据  范围:一次会话:多次请求中
            //1.获取Session对象
            HttpSession session = request.getSession();
            //2.调用方法存储数据
            session.setAttribute("sname","优秀");
            System.out.println("session01:"+session.getId());
            System.out.println("session01:"+session);
    
            //将sessionId存入 cookie中
            Cookie cookie = new Cookie("JSESSIONID",session.getId());
            cookie.setMaxAge(60);
            response.addCookie(cookie);
        }
    
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doPost(request, response);
        }
    }
    
  2. 如果服务器正常关闭,浏览器没有关闭,session对象有没有被销毁?还能不能获取到session中存储的数据?

    session钝化:指的是服务器正常关闭,会自动将session数据持久化保存到硬盘的文件上。

    session活化:指的是服务器正常启动,会将持久化的session数据加载到内存中,重新创建一个session对象,存储活化后的数据,但是sessionId没有改变。

    注意:session的钝化和活化是服务器自动完成的,我们了解服务器的这种机制即可。

6.小结

  1. session基本使用 范围:一次会话【多次请求】
    1. 获取session对象 :request.getSession();
    2. 存值:session.setAttribute(key,value);
    3. 取值:session.getAttribute(key);
    4. 移除:session.removeAttribute(key);

  2. session有效期设置

    1. 设置有效时间:session.setMaxInactiveInterval(int seconds);
    2. 手动设置失效:session.invalidate();

一.域对象讲解

1.1三个域对象比较

域对象 创建 销毁 作用范围 应用场景
ServletContext 服务器启动 服务器正常关闭/项目从服务器移除 整个项目 记录访问次数,聊天室
HttpSession 第一次调用request.getSession()方法 session过期(默认30分钟)/调用invalidate()方法/服务器正常关闭 会话(多次请求) 验证码校验, ==保存用户登录状态==等
HttpServletRequest 来了请求 响应这个请求(或者请求已经接收了) 一次请求 servletA和jsp(servletB)之间数据传递(转发的时候存数据)

范围:httpServletReques【一次请求】–> HttpSession【一次会话】 --> ServletContext【整个应用】

基本使用:

​ 存储数据:setAttribute(String name,Object value);

​ 获取数据:getAttribute(String name);

​ 移除数据:RemoveAttribute(String name);

1.2三个域对象怎么选择?

  1. 常规选择:一般使用范围最小的能完成就选择最小的
  2. 具体请求选择:
    1. 转发:使用request作用域 重定向:使用session
    2. 查询:使用request作用域
    3. 根据范围:一次请求:【request】 一次会话:【session】 整个应用:【ServletContext】
本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到