缓存 ——> Cookie & Session & Redis

课前掌握

  • cookie:小饼干 小甜饼
  • session:会话、会议
  • 缓存:
    • Session 服务器端缓存 eg:Apache:html php asp\Tomcat:jsp
    • Cookie 本地浏览器缓存
    • Redis 数据库缓存:MYSQL是关系型数据库 Redis是非关系型数据库
    • Cookie和Session的关系
      • 一个Cookie可以认为是一个「变量」,形如name=value,存储在浏览器
        • 服务器可以一次设置多个 cookie,所以有时候说 cookie 也是「一组」键值对儿
      • 一个Session可以理解为一种数据结构,多数情况是「映射」(键值对),存储在服务器上

会话概述

  • 两个人你问我答的过程就是一个会话
  • 一个用户在某网站上的整个购物过程就是一个会话
  • Web应用中的会话过程类似于生活中的打电话过程,它指的是一个客户端(浏览器)与Web服务器之间连续发生的一系列请求和响应过程
  • 在Servlet技术中,提供了两个用于保存会话数据的对象,分别是Cookie和Session

Cookie对象

  • Cookie在浏览器和服务器之间的传输
    • 浏览器 & Cookie

      • 浏览器 ——> Cookie:将Server1的Cookie保存起来
      • Cookie ——> 浏览器:第一次访问,不存在cookie 后续访问,直接获取cookie
    • 浏览器 & 服务器

      • 浏览器 ——> 服务器:第一次访问Server1 后续访问Server1
      • 浏览器 ——> 服务器:第一次响应 setCookie: name = value
    • 结论:

      • 第一次访问服务器,服务器会增加Set-Cookie头字段,将Cookie信息发送到浏览器,并保存到客户端
      • 当后续访问到服务器时,会在请求信息中将用户信息以Cookie的形式发送给服务器
如何创建Cookie?
  • 在Servlet API中提供了javax.servlet.http.Cookie类,它包含了生成Cookie信息(存入 - set)和提取(提取 - get)Cookie信息各个属性的方法

  • Cookie类的常见API

    显示用户上次访问时间

    • 构造方法(没有返回值类型、也无void)权限修饰符 方法名称.equals(类名)
      • public Cookie(java.lang.String name,java.lang.String value)
        • name:Cookie的名称
        • value:Cookie的值【键值对】
      • :Cookie一旦被创建,它的名称就不能更改
    • Cookie的创建方法【Cookie在Servlet下的】
      • LastAccessServlet
package cn.javabs.server.cookie;

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.text.SimpleDateFormat;
import java.util.Date;

@WebServlet("/lastAccessServlet")
public class LastAccessServlet extends HttpServlet {
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置编码乱码
        response.setContentType("text/html;charset=utf-8");
        // 如何创建Cookie?   通过请求对象进行获取Cookie
        // 获取所有的Cookie、并且存放在 Cookie数组中
        Cookie[] cookies = request.getCookies();
        System.out.println("cookie" + cookies.length);
        /**
         * 有没有可能是空的!  答案: 有可能是空的。
         * 没有上网、没有发出请求、浏览器就不会给你响应、没有响应就没有cookie信息
         * 如果cookies 是空的、 长度有没有?  答案: 没有长度
         */
        // 遍历数组
        for (int i = 0; cookies != null && i < cookies.length; i++) {
            System.out.println("cookie" + i + "的名字是:" + cookies[i].getName());
            if ("lastAccessTime".equals(cookies[i].getName())) {
                String value = cookies[i].getName();
                System.out.println("value" + value);
                break;
            }
        }
        /**
         * 创建Cookie?  实例化
         * Cookie cookie = new Cookie();
         * 报错  是因为会去访问有参数的构造方法、 没有写参数
         * 查看源代码发现如下:  name 是 cookie 的名称 | value 是cookie的值
         * public Cookie(String name, String value) {}
         */
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        String currentTime = sdf.format(date);
        System.out.println("currentTime" + currentTime);
        currentTime.replace("", "");
    }
}

Session对象

  • 概念
    • 客户端(浏览器)存储到服务器(Tomcat)的过程叫做Session技术
    • 当浏览器访问Web服务器时,Servlet容器就会创建一个Session对象和ID属性,Session对象相当于病历档案,ID相当于就医卡号
    • Session是借助Cookie技术来传递ID属性的 【因为Session是服务器的,Cookie是客户端的】
  • 如何获取Session对象?
    • HttpServletRequest定义了用于获取Session对象的getSession()方法
      public HttpSession getSession(boolean create)
      public HttpSession getSession()

    • HttpSession的重要方法
      • ServletContext getServletContext()
            用于返回前HttpSession对象所属于的web应用程序对象
        void setAttribute(String name,String value)
            用于将一个对象与一个名称关联后存储到当前的HttpSession对象中
        String getAttribute()
            用于从当前HttpSession对象中返回制定名称的属性对象
        void removeAttribute(String name)
            用于从当前HttpSession对象中删除指定名称的属性
        
  • 结论:
    • Web服务器采用了超时管理来判断客户端是否存在 【超时的时间值,单位为分钟】
      • 若在一定时间内没有请求访问,那么将对应的Session变成垃圾,进行清除;反之,web服务器会创建一个新的Session镀锡iang,并分配一个ID属性
      • <Session-config>
        <session-timeout>30</session-timeout>
        </Session-config>
        
  • 案例一:Session实现购物车
  • 设计图书实体类
    • public class Book {
          private int id;
          private String name;
          private String price;
          // 生成Getter Setter方法和toString()方法
      }
      
  • 数据库创建图书表
    • create database usermanager
      user usermanager
      create table book(
      	id int primary key auto_increment,
          name varchar(30) not null unique,
          price double
      );
      
  • BookServlet
    • package cn.javabs.server.session;
      
      import javax.servlet.ServletException;
      import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.*;
      import java.io.IOException;
      import java.util.List;
      
      @WebServlet("/bookServlet")
      public class BookServlet extends HttpServlet {
          BookService bookService = new BookService();
      
          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              doGet(request,response);
          }
          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              response.setContentType("text/html;charset=utf-8");
      
              String anhao = request.getParameter("anhao");
              switch (anhao){
                  case "find":
                      find(request,response);
                      break;
                  case "buy":
                      buy(request,response);
              }
          }
      
            /**
           * 查询图书列表
           */
          private void find(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              List bookList = bookService.findAllBook();
              request.setAttribute("list",bookList);
        	request.getRequestDispatcher("/server/bookList.jsp").forward(request,response);
          }
      }
      
          /**
           * 购买的图书
           */
          private void buy(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              String sid = request.getParameter("id");
              int id = Integer.parseInt(sid);
              Book book = bookService.findBookById(id);
              // 创建会话对象
              HttpSession session = request.getSession();
              session.setAttribute("book",book);
              Cookie cookie = new Cookie("JSESSIONID",session.getId());
              response.addCookie(cookie);
              request.getRequestDispatcher("/day09/success.jsp").forward(request,response);
      
          }
      }
      
  • BookService
    • package cn.javabs.server.session;
      
      import java.util.List;
      
      public class BookService {
          BookDao bookDao = new BookDao();
          public List findAllBook() {
              return bookDao.find();
          }
          public Book findBookById(int id) {
              return bookDao.findBookById(id);
          }
      }
      
  • BookDao
    • package cn.javabs.server.session;
      
      import cn.javabs.user.util.DruidUtils;
      import org.apache.commons.dbutils.QueryRunner;
      import org.apache.commons.dbutils.handlers.BeanHandler;
      import org.apache.commons.dbutils.handlers.BeanListHandler;
      import java.sql.SQLException;
      import java.util.List;
      
      public class BookDao {
          QueryRunner qr = new QueryRunner(DruidUtils.getDataSource());
          /**
           * 查询图书列表
           */
          public List find() {
              try {
                  return qr.query("select * from book",new BeanListHandler<>(Book.class));
              } catch (SQLException e) {
                  throw new RuntimeException(e);
              }
          }
          /**
           * 根据传入的id查询图书
           */
          public Book findBookById(int id) {
              try {
                  return qr.query("select * from book where id=?",new BeanHandler<>(Book.class));
              } catch (SQLException e) {
                  throw new RuntimeException(e);
              }
          }
      }
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值