【MapSheep】
[好记性不如烂笔头]

置顶

  1. 注意事项
    • 只能在同一个浏览器创建,同一个浏览器代表同一次会话。比如说你在Chrome中请求了创建Cookie接口,然后你在Firefox中请求遍历Cooke接口,就拿不到。
  2. 会话技术
    • 什么是会话?
      • 一次会话中包含多次的请求和相应。
    • 一次会话?
      • 浏览器第一次给服务器资源发送请求,建立会话。
    • 会话结束?
      • 直到有一方断开,(关闭浏览器 || 关闭服务器)。
    • 会话的功能?
      • 在一次会话范围内的多次请求之间,共享数据。
    • 共享数据的方式,Java中包含两种会话技术。
      • Cookie【客户端】
      • Session 【服务器端】

  1. JSP学习
    • 概念
      • Java Server Pages : Java服务器端页面可以理解为:一个特殊的页面,其中既可以指定定义html标签,又可以定义Java代码
      • 用于简化书写!简化 ----》response.getWriter().write("写HTML代码");
    • 原理
      • JSP本质上就是一个Service。
      • index.jsp ----》_index.java ----》index.class ----》由字节码提供访问。
        • 服务器解析请求头是否有index.jsp
        • 如果找到将index.jsp转换为下划线index.java
    • 目录
      • Tomcat目录下work放运行时产生的文件,该目录存放Java、字节码。访问页面就会生成该目录。
      • C:\Users\用户名.IntelliJIdea2018.2\system\tomcat\Tomcat_9_0_14_my-batis\work\Catalina\localhost\ROOT\org\apache\jsp
    • JSP的小脚本,JSP定义Java代码的方式。
      • 注:都会在idea配置文件work目录下生成Java源代码。
      • <% 代码 %>:定义的Java代码,在Service方法中,类似于Java的局部变量。
      • <%! 代码 %>:定义的Java代码,类似于Java的成员位置。
      • <%= 代码 %>:定义的java代码,会输出到页面上,取值展示在页面上。
    • JSP的内置对象
      • 在JSP页面中不需要获取和创建,可以直接使用的对象JSP一共有9个内置对象。
      • 今天学习3个:request、response、out :字符输出流对象。
    • 小问题
      • response.getWriter()和out.write()的区别
      • 答:在Tomcat服务器真正给客户端做出响应之前,会先找response缓冲区数据,再找out缓冲区数据。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <%--Java代码输出 总是先输出--%>
    <% response.getWriter().write("response"); %>

    <%
        // 赋值
        int LouisVan = 2;
        // 输出项目相对路径
        out.write("相对路径");
    %>

    <%--局部变量--%>
    <%! private final int local = 10;%>

    <%--取值--%>
    <%= "成员变量: " + LouisVan +", 局部变量: "+ local%>

</body>
</html>
  1. 概念
    • 客户端会话技术,将数据保存至客户端。

  1. 快速入门,创建Cookie对象,请求URL:talk/JinLuLu
    • 响应头(Response Headers)返回,Set-Cookie: msg=JinLuLu

@RequestMapping("/JinLuLu")
public String pasha(HttpServletRequest request, HttpServletResponse response) throws Exception {
	// 1.创建Cookie对象
	Cookie cookie = new Cookie("msg", "JinLuLu");
	// 2.发送Cookie对象
	response.addCookie(cookie);
	return "创建cookie对象";
}

  1. 快速入门,遍历拿到Cookie对象,请求URL:talk/YuYaoYao
    • 请求头(Request Headers)装载,Cookie: msg=JinLuLu

public String YuYaoYao(HttpServletRequest request, HttpServletResponse response) throws Exception {
	// 3.遍历拿到Cookie对象
	if (null != request.getCookies()) {
		Arrays.stream(request.getCookies()).forEach(item -> System.out.println("Name: " + item.getName() + ", Value: " + item.getValue()));
	} else {
		System.out.println("Cookie数组为空");
	}
	return "遍历cookie对象";
}

  1. 导师田斌讲解:响应头、请求头


  1. 实现原理
    • 基于响应头Set-Cookie请求头Cookie实现。

  1. Cookie细节
    • 一次可不可以发送多个Cookie呢?
      • 可以
      • 可以创建多个Cookie对象,调用response.addCookie进行保存。
    • Cookie在浏览器中保存多长时间?
      • 默认情况下,Cookie保存在浏览器的内存中,当浏览器关闭,Cookie自动销毁。
      • 一般情况下,我们都希望在浏览器关闭的情况下,也保存Cookie信息;这里有持久化存储解决方案
        • setMaxAge(int 秒数)
          • 整数:将Cookie数据写到硬盘的文件中,持久化储存,Cookie存活时间以秒为单位。
          • 负数:代表默认情况。
          • 零:删除Cookie信息。
    • Cookie能不能存储中文?
      • Tomcat8之前不能直接设置中文,Tomcat8之后Cookie支持中文。
      • SpringBoot自动集成Tomcat8。
    • Cookie共享问题?
      • 假设在一个Tomcat服务器中,部署了多个Web项目,那么在这些Web项目中Cookie能不能共享?
        • 默认情况下不能共享!
        • 想要实现共享调用
          • Cookie创建的时候,调用cookie.setPath("/");方法
          • 代表http://localhost:8888/ ,斜杠下所有的Web服务共享Cookie。
      • 不同服务器,Cookie是否可以共享?
        • 举例:百度、百度贴吧、百度新闻。
        • 怎么实现,使用共享域名实现?
          • news.baidu.com、tieba.baidu.com
          • 一级域名:baidu.com
          • 二级域名:news、tieba
        • 实现
          • setDomain(String path);如果设置一级域名相同。那么多个服务器之间Cookie可以共享!
          • cookie.setDomain(".baidu.com"),那么tieba.baidu.com、news .baidu.com中Cookie可以共享!

  1. Cookie的特点和作用?
    • Cookie存储数据在客户端浏览器、不太安全,易丢失、易篡改。
    • 浏览器对于单个Cookie的大小有限制(4kb)以及对同一个域名下的总Cookie数量也有限制(20个)。
    • 作用
      • Cookie一般用于存储少量的不太敏感的数据。
      • 在不登录的情况下,完成服务器对客户端的身份识别。

  1. 案例一
    • 需求
      • 访问一个Servlet,如果是第一次访问,则提示:您好,欢迎您首次访问。
      • 如果不是第一次访问,则提示:欢迎回来,您上次访问时间为:显示时间字符串。
    • 分析
      • 在服务器中的Servlet判断是否有一个名为lastTime的Cookie对象。
      • 有:不是第一次访问
        • 响应数据:欢迎回来,您上次访问时间为:2021年8月21日10:11:49
        • 写回Cookie : lastTime=2021年8月21日10:12:04 (注意:第二次访问的时间写回)
      • 没有:是第一次访问响应数据:您好,欢迎您首次访问写回Set-Cookie : lastTime=2021年8月21日10:11:49

Session

  1. 知识点

    • Session的实现是依赖于Cookie的
      • 请求:Cookie: JSESSIONID=6A2B2AAF1A1A3C0D7A9D794C2990B1F2
      • 响应:Set-Cookie: JSESSIONID=6A2B2AAF1A1A3C0D7A9D794C2990B1F2;
  2. 快速入门


  1. 服务器如何确保在一次会话范围内,多次获取的Session对象是同一个呢?


  1. 细节
    • 当客户端关闭后,服务器不关闭,两次获取session是否为同一个?
      • 答:默认情况下,不是。
      • 解决方案:/Session
    • 客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
      • 不是同一个,但是要确保数据不丢失(比如买手机加入购物车,期间服务器关闭,购物车数据会被清空!!!)
      • 解决方案!
        • 注:Tomcat自动帮我们把钝化和活化的事儿给办了!IDEA不行,因为IDEA重启Tomcat会删除work文件重建,则读取不到。
        • Session钝化?
          • 在服务器正常关闭之前,将Session对象序列化到硬盘上。
          • (D:\MapCode\Tomcat9\work 在此目录保存 SESSIONS.ser 的Session对象)
        • Session活化?
          • 在服务器启动后,将Session文件转化为内存中的Session对象即可。
          • 服务器正常启动D:\MapCode\Tomcat9\work\SESSIONS.ser 文件会被删除
    • Session什么时候被销毁?
      • 服务器关闭
      • Session对象调用invalidate()方法。
      • Session默认失效时间 30分钟!(例:30分钟内用户不做任何操作,则需要重新登陆)
      • Tomcat下web.xml修改Session的过期时间。

    • Session的特点

    • 案例·验证码
      • 需求

      • 图文讲解

  1. 2023年5月10日

posted on 2021-08-12 14:23  (Play)  阅读(255)  评论(0编辑  收藏  举报