IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> java中的会话技术总结(Session和cookie) -> 正文阅读

[网络协议]java中的会话技术总结(Session和cookie)

java中的会话技术总结(Session和cookie)

会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。

  • 从浏览器发出请求到服务端响应数据给前端之后,一次会话(在浏览器和服务器之间)就被建立了
  • 会话被建立后,如果浏览器或服务端都没有被关闭,则会话就会持续建立着
  • 浏览器和服务器就可以继续使用该会话进行请求发送和响应,上述的整个过程就被称之为会话

在这里插入图片描述

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

  • 服务器会收到多个请求,这多个请求可能来自多个浏览器,如上图中的6个请求来自3个浏览器
  • 服务器需要用来识别请求是否来自同一个浏览器
  • 服务器用来识别浏览器的过程,这个过程就是会话跟踪
  • 服务器识别浏览器后就可以在同一个会话中多次请求之间来共享数据

为什么现在浏览器和服务器不支持数据共享呢?

  • 浏览器和服务器之间使用的是HTTP请求来进行数据传输
  • HTTP协议是无状态的,每次浏览器向服务器请求时,服务器都会将该请求视为新的请求
  • HTTP协议设计成无状态的目的是让每次请求之间相互独立,互不影响
  • 请求与请求之间独立后,就无法实现多次请求之间的数据共享

分析完具体的原因后,那么该如何实现会话跟踪技术呢? 具体的实现方式有:

(1)客户端会话跟踪技术:Cookie

(2)服务端会话跟踪技术:Session

这两个技术都可以实现会话跟踪,它们之间最大的区别:Cookie是存储在浏览器端而Session是存储在服务器端

Cookie

Cookie:客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问。

1、Cookie的就基本使用

对于Cookie的使用,我们更关注的应该是后台代码如何操作Cookie,对于Cookie的操作主要分两大类,本别是发送Cookie获取Cookie,对于上面这两块内容,分别该如何实现呢?

1.1、发送Cookie
  • 创建Cookie对象,并设置数据

    Cookie cookie = new Cookie("key","value");
    
  • 发送Cookie到客户端:使用response对象

    response.addCookie(cookie);
    
  • 代码案例演示

    需要创建一个web项目来完成演示,和必须的maven依赖

    编写Servlet类,名称为AServlet

    在Servlet中创建Cookie对象,存入数据,发送给前端

    package com.zcl.webs; /**
     * TODO:
     *
     * @author zcl
     * @date 2022/3/29 6:27
     */
    
    import javax.servlet.*;
    import javax.servlet.http.*;
    import javax.servlet.annotation.*;
    import java.io.IOException;
    
    @WebServlet("/sServlet")
    public class AServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // 发送cookie
            // 创建cookie对象
            Cookie cookie = new Cookie("username", "zs");
            // 发送cookie
            response.addCookie(cookie);
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doGet(request, response);
        }
    }
    
    
  • 启动测试,浏览器查看Cookie的方式

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

1.2、Cookie的获取
  • 获取客户端携带的所有Cookie,使用request对象

    Cookie[] cookies = request.getCookies();
    

    因为获取的到的是所有Cookie,所以使用的过程中需要通过判断筛选我们需要的Cookice

  • 遍历数组,获取每一个Cookie对象:for

  • 使用Cookie对象方法获取数据

    cookie.getName();
    cookie.getValue();
    
  • 代码演示

    需求:在Servlet中获取前一个案例存入在Cookie对象中的数据

    1.编写一个新Servlet类,名称为BServlet

    2.在BServlet中使用request对象获取Cookie数组,遍历数组,从数据中获取指定名称对应的值

    3.启动测试,在控制台打印出获取的值

    1、编写一个新Servlet类,名称为BServlet

    package com.zcl.webs; /**
     * TODO:
     *
     * @author zcl
     * @date 2022/3/29 6:27
     */
    
    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;
    
    @WebServlet("/bServlet")
    public class BServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // 获取Cookie
            // 1、获取Cookie数组
            Cookie[] cookies = request.getCookies();
            // 2、遍历数据
            for (Cookie cookie : cookies) {
                // 判断是否是需要的数据
                // 3、获取键名称
                String name = cookie.getName();
                if("username".equals(name)){
                    // 3、获取值
                    String value = cookie.getValue();
                    System.out.println(name + "," + value);
                    break;
                }
            }
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doGet(request, response);
        }
    }
    
    

    2、启动服务器

    先访问aServlet获取到Cookie再访问bCookie获取数据打印控制器

2、Cookie的原理

对于Cookie的实现原理是基于HTTP协议的,其中设计到HTTP协议中的两个请求头信息:

  • 响应头:set-cookie

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

  • 请求头: cookie

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

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

3、Cookie的使用细节

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

3.1、存活时间
setMaxAge(int seconds)

参数值为:

1.正数:将Cookie写入浏览器所在电脑的硬盘,持久化存储。到时间自动删除

2.负数:默认值,Cookie在当前浏览器内存中,当浏览器关闭,则Cookie被销毁

3.零:删除对应Cookie

接下来,咱们就在AServlet中去设置Cookie的存活时间。

//1. 创建Cookie对象
Cookie cookie = new Cookie("username","zs");
//设置存活时间   ,1周 7天
cookie.setMaxAge(60*60*24*7); //易阅读,需程序计算
//cookie.setMaxAge(604800); //不易阅读(可以使用注解弥补),程序少进行一次计算

重启服务器,先访问aServlet控制器再关闭浏览器再打开直接访问bServlet控制器

查看Cookie生存时间

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

3.2、Cookie存储中文

直接Cookie存储中文会报错的

这个时候,我们可以使用之前学过的一个知识点叫URL编码,所以如果需要存储中文,就需要进行转码,具体的实现思路为:

1.在AServlet中对中文进行URL编码,采用URLEncoder.encode(),将编码后的值存入Cookie中

2.在BServlet中获取Cookie中的值,获取的值为URL编码后的值

3.将获取的值在进行URL解码,采用URLDecoder.decode(),就可以获取到对应的中文值

(1)在AServlet中对中文进行URL编码

// 发送cookie
// 创建cookie对象
// Cookie cookie = new Cookie("username", "zs");
// 存储中文
String value = "张三";
// 先对中文数据编码,直接存储中文会报错
value = URLEncoder.encode(value,"UTF-8");
System.out.println(value);
Cookie cookie = new Cookie("username", value);

获取Cookie中的数据并解码

// 1、获取Cookie数组
Cookie[] cookies = request.getCookies();
// 2、遍历数据
for (Cookie cookie : cookies) {
    // 判断是否是需要的数据
    // 3、获取键名称
    String name = cookie.getName();
    if("username".equals(name)){
        // 3、获取值
        String value = cookie.getValue();
        // 对数据进行解码
        value = URLDecoder.decode(value,"utf-8");
        System.out.println(name + "," + value);
        break;
    }
}

小结

Cookie的使用细节中,我们讲了Cookie的存活时间存储中文:

  • 存活时间,需要掌握setMaxAage()API的使用

  • 存储中文,需要掌握URL编码和解码的使用

Session

1.概念

Session:服务端会话跟踪技术:将数据保存到服务端。

  • Session是存储在服务端而Cookie是存储在客户端
  • 存储在客户端的数据容易被窃取和截获,存在很多不安全的因素
  • 存储在服务端的数据相比于客户端来说就更安全

2.Session的工作流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1GvHEptq-1648535666717)(image/会话/image-20220329072510718.png)]

  • 在服务端的AServlet获取一个Session对象,把数据存入其中
  • 在服务端的BServlet获取到相同的Session对象,从中取出数据
  • 就可以实现一次会话中多次请求之间的数据共享了
1、Session的就基本使用

在JavaEE中提供了HttpSession接口,来实现一次会话的多次请求之间数据共享功能。

具体的使用步骤为:

  • 获取Session对象,使用的是request对象
HttpSession session = request.getSession();
  • Session对象提供的功能:

    1. 存储数据到 session 域中

      void setAttribute(String name, Object o)
      
    2. 根据 key,获取值

      Object getAttribute(String name)
      
    3. 根据 key,删除该键值对

      void removeAttribute(String name)
      

案例代码演示

需求:在一个Servlet中往Session中存入数据,在另一个Servlet中获取Session中存入的数据

1.创建名为SessionDemo1的Servlet类

2.创建名为SessionDemo2的Servlet类

3.在SessionDemo1的方法中:获取Session对象、存储数据

4.在SessionDemo2的方法中:获取Session对象、获取数据

5.启动测试

(1)创建名为SessionDemo1的Servlet类

package com.zcl.webs.Session; /**
 * TODO:
 *
 * @author zcl
 * @date 2022/3/29 7:28
 */

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet("/demo1")
public class SessionDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 存储数据到Session

        // 1、获取对象
        HttpSession session = request.getSession();
        // 2、存储数据
        session.setAttribute("username","zs");
    }

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

(1)创建名为SessionDemo2的Servlet类,在doGet()方法中写如下代码

// 获取Session中获取数据
HttpSession session = request.getSession();
// 1、获取数据
Object username = session.getAttribute("username");
System.out.println(username);

执行流程

  1. 启动服务器访问demo1,发送Session数据到服务端
  2. 访问demo2控制器,获取Session数据,输出控制台

小结:

**注意:**Session中可以存储的是一个Object类型的数据,也就是说Session中可以存储任意数据类型。

5、Session的原理

Session是基于Cookie实现的

(1)前提条件

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

Session要想实现一次会话多次请求之间的数据共享,就必须要保证多次请求获取Session的对象是同一个。

同一个浏览器分别访问上面的demo1和demo2分别在控制台打印Session对象,获取到的地址是一样的

把demo1和demo2请求刷新多次,控制台最终打印的结果都是同一个

那么最主要的问题就来了,Session是如何保证在一次会话中获取的Session对象是同一个呢?

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

Session实例演示

访问demo1查看请求set-cookie

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

访问demo2查看Cookie

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

6、Session的使用细节

1、Session钝化与活化

服务器重启后,Session中的数据是否还在?

(1)服务器端AServlet和BServlet共用的session对象应该是存储在服务器的内存中

(2)服务器重新启动后,内存中的数据应该是已经被释放,对象也应该都销毁了

对于session的数据,我们应该做到就算服务器重启了,也应该能把数据保存下来才对。

那么Tomcat服务器在重启的时候,session数据到底会不会保存以及是如何保存的?

注意:这里所说的关闭和启动应该要确保是正常的关闭和启动。

那如何才是正常关闭Tomcat服务器呢?

需要使用命令行的方式来启动和停止Tomcat服务器:

启动:进入到项目pom.xml所在目录,执行tomcat7:run

停止:在启动的命令行界面,输入ctrl+c

只要服务器是正常关闭和启动,session中的数据是可以被保存下来的。

钝化:在服务器正常关闭后,Tomcat会自动将Session数据写入硬盘的文件中

  • 钝化的数据路径为:项目目录\target\tomcat\work\Tomcat\localhost\项目名称\SESSIONS.ser

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

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

    • 数据加载到Session中后,路径中的SESSIONS.ser文件会被删除掉

小结

Session的钝化和活化介绍完后,需要我们注意的是:

  • session数据存储在服务端,服务器重启后,session数据会被保存
  • 浏览器被关闭启动后,重新建立的连接就已经是一个全新的会话,获取的session数据也是一个新的对象
  • session的数据要想共享,浏览器不能关闭,所以session数据不能长期保存数据
  • cookie是存储在客户端,是可以长期保存
7、Session销毁

session的销毁会有两种方式:

  • 默认情况下,无操作,30分钟自动销毁

    • 对于这个失效时间,是可以通过配置进行修改的

      • 在项目的web.xml中配置

        <?xml version="1.0" encoding="UTF-8"?>
        <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
                 version="4.0">
            <session-config>
                <session-timeout>30</session-timeout>
            </session-config>
        </web-app>
        
      • 如果没有配置,默认是30分钟,默认值是在Tomcat的web.xml配置文件中写死的

    调用Session对象的invalidate()进行销毁

    • 在SessionDemo2类中添加session销毁的方法

      // 销毁
      session.invalidate();
      
    • 该销毁方法一般会在用户退出的时候,需要将session销毁掉。

Cookie和Session小结

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

所需两个对象放在一块,就需要思考:

Cookie和Session的区别是什么?

Cookie和Session的应用场景分别是什么?

  • 区别:
    • 存储位置:Cookie 是将数据存储在客户端,Session 将数据存储在服务端
    • 安全性:Cookie不安全,Session安全
    • 数据大小:Cookie最大3KB,Session无大小限制
    • 存储时间:Cookie可以通过setMaxAge()长期存储,Session默认30分钟
    • 服务器性能:Cookie不占服务器资源,Session占用服务器资源
  • 应用场景:
    • 购物车:使用Cookie来存储
    • 以登录用户的名称展示:使用Session来存储
    • 记住我功能:使用Cookie来存储
    • 验证码:使用session来存储
  • 结论
    • Cookie是用来保证用户在未登录情况下的身份识别
    • Session是用来保存用户登录后的数据

用户登录注册案例

通过行一篇的【MVC模式和三层架构(附综合案例增删改查)】基础上进行完善操作

MVC模式和三层架构(附综合案例增删改查)_小钟要学习!!!的博客-CSDN博客
完成登录注册功能跳转,勾选记住密码能使用cookie存储数据并回填,登录成功显示登录信息

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-03-30 19:06:09  更:2022-03-30 19:06:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:28:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码