1. 概念
    1. 现实中:我进入办公室和班主任聊天,包括中间聊的事情。是一次完整的会话 java中:浏览器和服务器开始交互,到交互结束,包括中间做的事情,属于一次完整的会话。
    2. 简单点说
      1. 多次请求和响应
  2. 客户端技术
    1. cookie
      1. 概念
        1. 存储在浏览器端数据的一种技术,可以被发送到服务器端,实现客户端和服务器端的数据交互
      2. API
        1. 创建 new Cookie(String name, String value)
        2. 获取客户端所有的 Cookie[] request.getCookies();
        3. 向客户端写入 response.addCookie(Cookie cookie);
      3. 演示
        1. 代码
        2. cookie工具类
          1. 为什么要写工具类
          2. 因为request只提供了一个获取所有cookie的方法,如果每次查找指定的cookie很不方便,所以定义工具类,工具类的功能是根据cookie的名字获取对应的cookie
          3. 添加的cookie的时候经常忘了设置maxage,domain,path
          4. 删除cookie的时候也会忘了maxage的值是多少
          5. 代码
          6. 查询
          7. 添加
          8. 删除
      4. 生命周期
        1. 默认
          1. 关掉浏览器就清除,因为默认存在内存中 setMaxAge(-数);
        2. 延长生命周期
          1. c.setMaxAge(60);//1分钟的意思
          2. c.setMaxAge(60*60);//一小时
          3. c.setMaxAge(365*24*60*60);//一年,一般一年起步
          4. 注意事项
          5. cookie.setMaxAge设置为0时,会在浏览器上删除指定的cookie
          6. cookie.setMaxAge设置为-1时,代表关闭当前浏览器即失效。
        3. 删除cookie
          1. setMaxAge(0)
      5. cookie共享问题
        1. setPath("/day16/dir1") 表示只能被dir1目录下的资源访问cookie
        2. setPath("/day16"):表示可以被/day16下面的资源访问
        3. setPath("/") 表示可以被localhost:8080/下面的所有的servlet操作
        4. 结论:以后全部写/,这样子相当于没有限制了,操作起来方便.
        5. domain以后写公司域名比如.baidu.com
      6. 案例
        1. 需求
          1. 用户第一次访问servlet,页面显示欢迎访问,否则页面显示上一次访问的时间
        2. 思路
          1. 1.从cookie中获取上次访问时间 2.如果没有获取到页面显示欢迎您,否则页面显示上次访问时间 3.将本次访问时间通过cookie存入到浏览器中
        3. 代码
  3. 服务端技术
    1. session
      1. 获取
        1. HttpSession session = request.getSession();
      2. 生命周期
        1. 在一次会话。多次请求中有效。(记忆的时候要和request进行比较,request是一次请求中有效)
      3. 原理
        1. 每次将cookie中的JSESSIONID传给服务器,然后去服务器的内存中去找对应的seession数据,从而保证数据在多次请求中有效
      4. 应用场景
        1. 因为每个用户使用的浏览器不一样,里面的JESSIONID也不一样,那么JSESSIONID我们可以看成用户的唯一标识。所以session中一般用来存储每个用户的相关数据
      5. session中的问题
        1. 1.浏览器关闭了,服务器中的session还存在吗?
          1. 经常问:session的生命周期什么时候结束,很多人都回答浏览器关闭session就销毁了,这句话对吗?
          2. ​不对,浏览器关闭了服务器中的session还在,但是浏览器器中的JSEESIONID默认情况下浏览器关闭就没了,当重新打开浏览器再次访问服务器的时候只会重新创建一个Session。如果想要让两次获取到的session是同一个,可以修改保存在浏览器的JSESSIONID的maxAge的值,来延长cookie的生命周期
        2. 浏览器关闭了,重新打开,还是之前的session吗?
          1. 不是的,因为浏览器cookie中有一个JSESSIONID,这个cookie默认是存在内存中的,浏览器关闭,cookie就没了,所以重新打开浏览器,再次访问时会生成一个新的JESSIONID,所以通过新的JSESSIONID找到的就不是同一个sesion
        3. 如何让浏览器关闭,重新打开,访问的还是原来的session
          1. 延长JSESSIONID这个cooked的生命周期 Cookie cookie = new Cookie("JSESSIONID",session.getId()); cookie.setMaxAge(60*60); response.addCookie(cookie);
        4. 2.服务器重启后原来的sesssion还在吗?
          1. 原理
          2. ​ 正常关闭tomcat的时候,会把所有内存中的session写入到硬盘中的文件,这个操作叫做(序列化/钝化/写入) ​ 当再次启动tomcat的时候,会把硬盘中的session读取到内存。这个操作叫做(反序列化/活化/读取)
        5. 3.session销毁
          1. 默认30分钟,修改默认配置:D:\develop\apache-tomcat-8.5.31\conf\web.xml 修改
          2. request.getSession().invalidate();
  4. session和cookie的区别
    1. session存在服务器,cookie存在客户端
    2. session没有大小限制,cookie有4k
    3. session安全,cookie不安全
    4. session基于cookie
  5. JSP
    1. 概念:
      1. 长的像html页面的servlet。当访问这个jsp页面的时候tomcat会把jsp变成xxx_servlet.java文件,并且执行编译后的servlet代码
    2. JSP页面每次访问都会重新编译成对应的servlet吗?
      1. 不是、第一次才编译,除非修改了JSP页面
    3. 如何向jsp中插入java代码(脚本)
      1. 插入任意Java代码
        1. <% Java代码 %>
      2. 将变量值显示到页面
        1. <%=变量%>
    4. 内置对象9个
      1. request
        1. 回显数据用
      2. response
      3. out
        1. 这个out和response.getWriter()的区别
          1. out会把数据写入到缓冲区。 response.getWriter()会直接把数据写到页面。
      4. session
        1. 验证码、购物车、存用户信息
      5. pageContext
        1. 讲EL表达式的时候简单用一下
      6. application
        1. 一般不用
      7. page
      8. config
      9. exception
  6. session和cookie的使用场景
    1. session
      1. 验证码
      2. 登录成功后将用户信息存到session
      3. 购物车
    2. cookie
      1. 浏览记录
      2. 帐号和密码(记住密码功能)
  7. 案例
    1. 登陆功能
      1. 知识点
        1. 1.登陆成功后要将用户信息存入session
        2. 2.登陆失败返回login.jsp页面,要回显错误信息
        3. 3.只有转发不加虚拟路径
        4. 4.虚拟路径能写活不要写死