百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

session和cookie的区别和应用的场景对比,使用springboot实现

wxin55 2024-11-01 14:29 7 浏览 0 评论

Session和Cookie的区别及应用场景

让我们先来了解一下Session和Cookie的概念。

Cookie是一种存储在客户端(浏览器)中的小型文本文件,用于跟踪用户在网站上的活动。服务器在响应HTTP请求时,通过响应头将Cookie发送给浏览器,浏览器将其存储下来。每次浏览器向同一服务器发送请求时,它都会自动携带相应的Cookie。Cookie通常用于实现用户身份验证、记录用户首选项、跟踪用户行为等功能。

Session是一种在服务器端存储用户信息的机制。当用户首次访问服务器时,服务器会为该用户创建一个唯一的Session,并将Session标识符(Session ID)发送给浏览器,浏览器将其存储在Cookie中。在后续的请求中,浏览器会自动将Cookie中的Session ID发送给服务器,服务器根据Session ID来查找并恢复相关的用户信息。Session通常用于存储敏感数据,如用户登录信息、购物车内容等。

下面是Session和Cookie的区别:

  1. 存储位置:Cookie存储在客户端,而Session存储在服务器端。
  2. 数据容量:Cookie的容量较小,通常为几KB,而Session的容量较大,可以存储更多的数据。
  3. 安全性:由于Cookie存储在客户端,所以有一定的安全风险,如被窃取或篡改。而Session存储在服务器端,相对来说更加安全。
  4. 可访问性:Cookie可以被客户端访问和修改,而Session只能在服务器端访问和修改。
  5. 生命周期:Cookie可以设置一个过期时间,可以在浏览器关闭后依然保持,也可以在指定时间后自动删除。而Session通常在用户关闭浏览器或一段时间不活动后自动销毁。

现在,让我们来看一下在Spring Boot中如何使用Session和Cookie。

示例代码:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@Controller
public class UserController {

    @GetMapping("/login")
    public String login(HttpServletRequest request, HttpServletResponse response) {
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        // 验证用户名和密码
        if (username.equals("admin") && password.equals("123456")) {
            HttpSession session = request.getSession();
            session.setAttribute("username", username);

            // 创建一个Cookie并设置有效期
            Cookie cookie = new Cookie("sessionId", session.getId());
            cookie.setMaxAge(3600); // 设置为1小时
            response.addCookie(cookie);

            return "redirect:/profile";
        } else {
            return "login";
        }
    }

    @GetMapping("/profile")
    public String profile(HttpServletRequest request) {
        HttpSession session = request.getSession();
        String username = (String) session.getAttribute("username");

        if (username != null) {
            return "profile";
        } else {
            return "redirect:/login";
        }
    }

    @GetMapping("/logout")
    public String logout(HttpServletRequest request, HttpServletResponse response) {
        HttpSession session = request.getSession();
        session.removeAttribute("username");

        // 删除Cookie
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                if (cookie.getName().equals("sessionId")) {
                    cookie.setMaxAge(0); // 设置为0,立即删除
                    response.addCookie(cookie);
                    break;
                }
            }
        }

        return "redirect:/login";
    }
}

在上述示例中,我们使用Spring Boot创建了一个简单的登录系统。当用户通过GET请求访问登录页面时,我们从请求参数中获取用户名和密码,并验证用户信息。如果验证成功,我们创建一个Session并将用户名存储在其中。同时,我们创建一个名为"sessionId"的Cookie,并将其添加到响应中。

在访问个人资料页面时,我们从Session中获取用户名,如果用户名存在,则返回个人资料页面;否则,重定向到登录页面。

当用户点击注销时,我们从Session中删除用户名,并遍历请求中的Cookie,找到名为"sessionId"的Cookie并将其设置为立即删除。

通过以上示例,我们可以看到在Spring Boot中如何使用Session和Cookie来实现用户登录和注销功能。Cookie用于在客户端存储Session ID,并在每次请求中携带,而Session则在服务器端存储用户信息。这样,我们可以实现用户身份验证和敏感数据的安全存储。

应用场景:

  • 用户身份验证:通过Cookie存储Session ID,服务器验证Session中的用户信息来实现用户身份验证。
  • 购物车功能:使用Session存储用户的购物车信息,通过Cookie来标识用户的Session。
  • 记住登录状态:通过Cookie设置一个长期有效的Session ID,实现记住登录状态的功能。
  • 多服务器负载均衡:通过将Session存储在共享的外部存储中,实现多个服务器之间的Session共享,实现负载均衡。

总结起来,Cookie和Session在Web开发中都扮演着重要的角色。Cookie存储在客户端,方便在不同请求之间传递数据,而Session存储在服务器端,安全可靠。根据实际需求,我们可以合理运用Cookie和Session,提升用户体验和数据安全性。

相关推荐

Java中List 和 Map、Set 的区别(list和set和map)

hello,大家好,我是霖仔java集合的大家了解,我再给大家说一下他们的区别,希望能够帮助到大家结构特点:List和Set是存储单列数据的集合,Map是存储键和值这样的双列数据的集合;Lis...

Java 集合框架全面解析:选对数据结构,提升开发效率

上一章我们详细介绍了各种常用的数据结构情况(参考:数据结构复杂度全览:如何选择最优结构?),本文结合关键数据结构,从列表(List)、队列(Queue)、集合(Set)、映射(Map)四个维度,深入解...

LinkedList竟然比ArrayList慢了1000多倍?(动图+性能评测)

数组和链表是程序中常用的两种数据结构,也是面试中常考的面试题之一。然而对于很多人来说,只是模糊的记得二者的区别,可能还记得不一定对,并且每次到了面试的时候,都得把这些的概念拿出来背一遍才行,未免有些麻...

LinkedList 底层源码深度解析(linkedlist底层数据结构)

目录1.引言2.LinkedList概述2.1类继承体系图2.2各个接口作用3.与ArrayList的对比4.底层数据结构5.核心方法源码解析5.1add()方法5.2a...

List的用法和实例详解——Java进阶知识讲义系列(四)

序欢迎来到全网最完整的Java进阶知识系列教程!!!每天定时更新!!!本期是Java进阶知识系列的第四讲,将分享Java常用的数据容器——集合类。集合类也分很多类型,比如:List、Set、Map、Q...

Rust高效集合操作(rust基本操作)

集合的分类Rust的集合类型主要分布在标准库的std::collections模块中,同时也包括语言内置的数组和字符串类型序列容器序列容器维护元素的顺序,适合需要按索引访问或顺序遍历的场景向量(...

Java八股文:核心知识点梳理(java八股文是啥)

一、Java基础1.Java基本数据类型8种基本类型:整型:byte(1),short(2),int(4),long(8)浮点型:float(4),double(8)字符型:char(2)布...

面试题:ArrayList和LinkedList有什么区别?

面试题

为什么我不推荐研发人员使用 LinkedList?

在Java集合框架中,LinkedList作为List的实现之一,经常被认为是ArrayList的替代方案。然而,在大多数实际场景下,我们并不推荐使用LinkedList,原因主要集中...

ArrayList 、 LinkedList、Vector的区别

ArrayList、LinkedList、Vector的区别如下:ArrayListLinkedListVector结构动态数组双向链表动态数组是否线程安全否否是效率遍历查找快,插入删除慢插入删除...

(2020 )Java最新面试笔试题答案解析(一)

Java中的集中基本数据类型是什么?各占用多少字节?【数值型】—(整数类型)byte(1字节)short(2字节)int(4字节)long(8字节)拓展:Java中的数据类型除了上面的基本...

超简单五步实现Linux虚拟机CentOS 7系统Root密码忘记重置

环境:CentOS7.5重置root密码:1.CentOS7虚拟机开机,将鼠标光标移动至虚拟机内。2.在虚拟机中使用键盘上↑和↓键将选择行设置为第一行(背景高亮即为选中),按下键盘上的e,进...

吊轨门和推拉门哪个好?北京今朝区别介绍看完不入坑

厨房到底使用什么门好?相信这是大多数业主都比较抓狂的事情,其实在装修中材料的选择最终还是要依据空间而定,那么吊轨门和推拉门哪个好呢?下面就跟随北京装修网一起来看看吧!吊轨门与推拉门介绍吊轨门吊轨门的特...

〖省钱宝典〗不花冤枉钱,少走弯路!居家中推拉门如何设计?

想要空间最大程度的显大?想要充足的光线?又想拥有合理的区域划分?那么推拉门是你绝对不能错过的好选择。推拉门的设计轻盈简洁,绝对是室内每个空间的福音。它不仅可以最大化地节省空间,方便了居室的功能划分和利...

吊趟门与推拉门有什么区别?(吊趟门贵还是推拉门贵)

吊趟门与推拉门的区别很多人在购买的时候并不清楚,有些客人甚至根本分不清吊趟门和推拉门,今天小编就给大家讲讲吊趟门与推拉门的相关内容,看看吊趟门与推拉门的区别有哪些?1、推拉门采用以门扇下滑轮为主支撑点...

取消回复欢迎 发表评论: