啥子是会话?

用户打开浏览器 访问web服务器的资源 会建立 直到一方断开连接
回话结束。在一次会话中包含多次请求和响应
捕获.PNG
这里面就会存在三次会话

啥子是跟踪?

一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一个浏览器
以便在同一次会话的多次请求间共享数据

为什么要共享数据呢?
你比如说网购的购物车,我现在往浏览器中添加一个苹果手机
然后我又返回购物页面在选取一个小米手机添加到购物车那么我现在
返回购物车就会看到小米和苹果都在 那么这个就是说
是在一次会话当中有两次请求我就共享了那个苹果手机那个数据对不对

Http协议是无状态的,每次浏览器向服务器请求时 服务器都会将该请求视为
新的请求,因此我们需要会话跟踪技术来实现会话内数据共享

如果是有状态的那么请求一和请求二能够携带数据的话那么意味着前面的请求
每次都要携带后面的请求数据那么服务器压力就会大那么每次访问就会很慢。

所以Http协议,把每次请求设立成独立的那么就会很快,由于独立的原因
服务器并不知道每次请求之间的关联关系那么这个时候解决这个问题要用到
会话跟踪技术

实现方式的两门技术来解决会话跟踪问题:

客户端会话跟踪技术:Cookie
意思是将数据放在客户端的浏览器里面

服务端会话跟踪技术:Session
把数据放在服务端

  • Cookie基本使用
  • Cookie原理
  • Cookie 使用细节
  • Session基本使用
  • Session原理
  • Session使用细节
  • 案列

Cookie的工作流程:

捕获.PNG

我现在这个浏览器现在访问服务器资源的A
那么响应回来的数据会放在客户端浏览器当中
然后我请求二携带数据去访问资源B 那么资源B 就会得到我的资源吗

关注如何发送Cookie 和 获取Cookie
捕获.PNG
Cookie对象里面放的是键值对的形式
tomcat会从response取出Cookie数据响应到浏览器里面去
获取Cookie:
因为我这个会话还在所以我将来会携带着数据去访问服务器那么
他就会获取到很多个数据捕获.PNG

Cookie原理:

捕获.PNG

我ServletA 向浏览器存Cookie数据
那么我浏览器就会解析 set-cookie这个数据

下一次我浏览器就会携带着这个请求头里面的数据去访问ServletB

发送Cookie用的set-Cookie的响应头
获取Cookie用的是Cookie的请求头的

Cookie的存活时间:

默认情况下:Cookie存储在浏览器当中,当浏览器关闭 内存释放 则Cookie
被销毁

setMaxAge(int seconds):设置Cookie存活时间

  • 正数:将Cookie写入浏览器所在的电脑硬盘 持久化存储 到时间自动删除
  • 负数:默认值 Cookie 在当前浏览器内存当中 当浏览器关闭 则Cookie销毁
  • 零:删除对应Cookie

    1. @WebServlet("/aServlet")
    2. public class AServlet extends HttpServlet {
    3. @Override
    4. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    5. //发送Cookie
    6. //1. 创建Cookie对象
    7. Cookie cookie = new Cookie("username","zs");
    8. //设置存活时间 ,1周 7天
    9. cookie.setMaxAge(60*60*24*7); //易阅读,需程序计算
    10. //cookie.setMaxAge(604800); //不易阅读(可以使用注解弥补),程序少进行一次计算
    11. //2. 发送Cookie,response
    12. response.addCookie(cookie);
    13. }
    14. @Override
    15. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    16. this.doGet(request, response);
    17. }
    18. }

Cookie存储中文:
Cookie在默认的情况下面是不能直接存储中文的
AServlet中对中文进行URL编码

  1. @WebServlet("/aServlet")
  2. public class AServlet extends HttpServlet {
  3. @Override
  4. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  5. //发送Cookie
  6. String value = "张三";
  7. //对中文进行URL编码
  8. value = URLEncoder.encode(value, "UTF-8");
  9. System.out.println("存储数据:"+value);
  10. //将编码后的值存入Cookie中
  11. Cookie cookie = new Cookie("username",value);
  12. //设置存活时间 ,1周 7天
  13. cookie.setMaxAge(60*60*24*7);
  14. //2. 发送Cookie,response
  15. response.addCookie(cookie);
  16. }
  17. @Override
  18. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  19. this.doGet(request, response);
  20. }
  21. }

在BServlet中进行解码

  1. @WebServlet("/bServlet")
  2. public class BServlet extends HttpServlet {
  3. @Override
  4. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  5. //获取Cookie
  6. //1. 获取Cookie数组
  7. Cookie[] cookies = request.getCookies();
  8. //2. 遍历数组
  9. for (Cookie cookie : cookies) {
  10. //3. 获取数据
  11. String name = cookie.getName();
  12. if("username".equals(name)){
  13. String value = cookie.getValue();//获取的是URL编码后的值 %E5%BC%A0%E4%B8%89
  14. //URL解码
  15. value = URLDecoder.decode(value,"UTF-8");
  16. System.out.println(name+":"+value);//value解码后为 张三
  17. break;
  18. }
  19. }
  20. }
  21. @Override
  22. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  23. this.doGet(request, response);
  24. }
  25. }

Session原理:

服务端会话跟踪技术:将数据保存到服务端(是安全的)
其实Cookie在进行数据传输的时候数据是不安全的

Session是怎样在一次会话两次请求中获取数据的是通过
Session对象获取的捕获.PNG

  1. 创建名为SessionDemo1Servlet类获取Session对象存储数据
  2. @WebServlet("/demo1")
  3. public class SessionDemo1 extends HttpServlet {
  4. @Override
  5. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  6. //存储到Session中
  7. //1. 获取Session对象
  8. HttpSession session = request.getSession();
  9. //2. 存储数据
  10. session.setAttribute("username","zs");
  11. }
  12. @Override
  13. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  14. this.doGet(request, response);
  15. }
  16. }
  1. SessionDemo2:获取Session对象、获取数据
  2. ```java
  3. @WebServlet("/demo2")
  4. public class SessionDemo2 extends HttpServlet {
  5. @Override
  6. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  7. //获取数据,从session中
  8. //1. 获取Session对象
  9. HttpSession session = request.getSession();
  10. //2. 获取数据
  11. Object username = session.getAttribute("username");
  12. System.out.println(username);
  13. }
  14. @Override
  15. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  16. this.doGet(request, response);
  17. }
  18. }

```

原理:

Session的实现是基于Cookie 的
怎么基于Cookie的?
Session对象会有一个唯一标识 叫做id
捕获.PNG

细节:

Session 钝化 活化:
就是在我们重启服务器的时候这个Session对象是不是还存在?
服务器在正常的关闭和重启Session的数据是会存在的
钝化:
在服务器正常关闭后,Tomcat会自动将Session数据写入硬盘的文件

活化:
再次启动服务器后,从文件中加载数据到Session中

虽然说服务器的正常关闭之后获取的Sesion对象是一致的
但是在你关闭服务器之后重新启动请求那么你两次的请求的
Session对象其实是不一致的

Session销毁:
两种销毁i方式:
默认情况下 没有操作 三十分钟自动销毁

调用Session对象invalidate()方法
可以自己把自己销毁掉:
将来会把登录的信息存储到Session对象里面去
我一退出就要把Session对象销毁晓掉

小结:

Cookie和Session都是来完成一次会话内多次请求间的数据共享的
区别:

  • 存储位置不同
  • 安全性不同
  • 数据大小不同 Cookie最大3KB Session 无大小
  • 存储时间不同 Cookie 可以长期存储 Session默认三十分钟
  • 服务器性能不同 Cookie不占服务器资源 Session占用服务器资源