servlet和SpringBoot两种方式分别获取Cookie和Session方式比较(带源码) —— 图文并茂 两种方式获取Header

简介: 文章比较了在Servlet和Spring Boot中获取Cookie、Session和Header的方法,并提供了相应的代码实例,展示了两种方式在实际应用中的异同。

Cookie —— 客户端机制

Session —— 服务端机制

本篇博客主在用servlet和SpringBoot两种方式分别获取Session和Cookie,用来比较记忆与分析

1、cookie和Session以及Header知识点

(注:若完全不懂Cookie、Session以及Header是什么,必须去系统地学习一下,不要只靠着本篇博客)

cookie:

但以上只是客户端机制,此时在服务器这边就需要记录“令牌”信息,以及令牌对应的用户信息,这个就是Session机制所做的工作

Session:

Session就是 会话 的意思

服务器同一时刻收到的请求是很多的,服务器需要清楚的区分每个请求是属于哪个用户,也就属于哪个会话,就需要在服务器这边记录每个会话以及与用户的信息的对应关系

Session是服务器为了保存用户信息而创建的一个特殊的对象

Session中的值也保存在客户端的cookie中

Header:

Header即Http请求头(标头)

    HTTP标头(Header)是HTTP请求和响应中的一部分,用于传输与请求或响应相关的元数据信息。HTTP标头包含一系列键值对(名称-值对),用于传递与消息内容、处理、身份验证、缓存控制、内容类型等相关的信息。HTTP标头通常分为请求头(Request Headers)和响应头(Response Headers)两大类。

HTTP标头的一些常见用途包括:

  1. 身份验证:HTTP标头可以包含用于认证用户身份的信息,例如Authorization标头用于传递身份验证凭证。

  2. 内容类型Content-Type标头用于指定响应内容的MIME类型,帮助客户端正确解释响应的内容。

  3. 内容长度Content-Length标头指示响应内容的长度,以字节为单位。

  4. 缓存控制Cache-Control标头用于定义缓存策略,控制响应内容的缓存和过期行为。

  5. 跳转与重定向Location标头用于指定重定向的目标URL,Referer标头包含引导请求的URL。

  6. 用户代理信息User-Agent标头用于标识发送请求的用户代理(通常是浏览器或应用程序)的信息。

  7. 接受语言和内容编码Accept-LanguageAccept-Encoding标头允许客户端指定其首选的语言和内容编码。

  8. 跨域资源共享(CORS)Access-Control-Allow-Origin和其他相关标头用于支持跨域请求。

  9. 安全性X-Frame-OptionsStrict-Transport-Security等标头用于增强安全性。

  10. 自定义标头:开发人员可以定义自己的自定义HTTP标头以传递额外的信息。

    HTTP标头允许HTTP协议具有灵活性和可扩展性,以便在通信中传递各种元数据和指令。不同的HTTP请求和响应都可以包含不同的标头,以满足其特定的需求。这些标头对于Web开发和网络通信中非常重要,因为它们允许客户端和服务器之间进行有效的信息交换和控制。

2、设置/获取 Cookie

设置cookie——直接在浏览器中设置

点击检查后在如图位置设置Cookie

后端获取Cookie

servlet版本:(更常用)

    @RequestMapping("/getCookie")
    public String getCookie(HttpServletRequest request){
        // 拿到cookie
        Cookie[] cookies = request.getCookies();
//        for(Cookie cookie : cookies){
//            System.out.println(cookie.getName()+":"+cookie.getValue());
//        }
        // lam表达式,和上面循环意思一样
        if (cookies != null){
            // cookies为null时,会报空指针的异常,所以判断
            Arrays.stream(cookies).forEach(cookie -> {
                System.out.println(cookie.getName()+":"+cookie.getValue());
            });
        }
        return "获取cookie成功";
    }

Spring版本:

    // SpingBoot获取cookie
    @RequestMapping("/getCookie2")
    public String getCookie2(@CookieValue String userId,@CookieValue String goodId){
        return "cookie存取的值userId:" + userId + ",gooId:" + goodId;
    }

注:使用注解的方式只能一个一个的去拿

总结:最常用的是servlet版本,因为Spring版本只能一个一个的取值,servlet可以直接获取所有cookie

3、设置/获取Session

设置session

    @RequestMapping("/setSession")
    public String setSession(HttpServletRequest request){
        HttpSession session = request.getSession();
        session.setAttribute("userId", "6_6_6");
        return "success";
    }

servlet版本获取session:

    @RequestMapping("/getSession")
    public String getSession(HttpServletRequest request){
        // false: 如果没有session,会创建一个session
        HttpSession session = request.getSession(false);
        if(session != null){
            String userId = (String) session.getAttribute("userId");
            return "登录用户:"+userId;
        }
        return "session 为空";
    }

Spring方式获取Session:

    @RequestMapping("/getSession2")
    public String getSession2(@SessionAttribute(required = false) String userId){
        return "userId:" + userId;
    }

注:使用注解的方式只能一个一个的去拿

使用HttpSession内置对象获取Session

    @RequestMapping("/getSession3")
    public String getSession3(HttpSession session){
            String userId = (String) session.getAttribute("userId");
            return "登录用户:"+userId;
    }

注:这种内置对象的方式若没有获取到Session,即Session为空的情况下会报错

总结:servlet方式都较为常用

4、设置/获取Header

设置响应的Header:

    @ResponseBody
    @RequestMapping(value = "/r1",produces = "application/json;charset=utf-8")
//    @RequestMapping(value = "/r1")
    public String r1(HttpServletResponse response){
        //设置header
        response.setHeader("myhead","myhead");
        return "{'OK':1}";
    }

servlet方式获取Header:

    @RequestMapping("/getHeader")
    public String getHeader(HttpServletRequest request){
        String userAgent = request.getHeader("User-Agent");
        return "userAgent:" + userAgent;
    }

Spring方式获取Header:

    @RequestMapping("/getHeader2")
    public String getHeader2(@RequestHeader("User-Agent") String userAgent){
        return "userAgent:" + userAgent;
    }
目录
相关文章
|
9天前
|
前端开发 Java 数据安全/隐私保护
用户登录前后端开发(一个简单完整的小项目)——SpringBoot与session验证(带前后端源码)全方位全流程超详细教程
文章通过一个简单的SpringBoot项目,详细介绍了前后端如何实现用户登录功能,包括前端登录页面的创建、后端登录逻辑的处理、使用session验证用户身份以及获取已登录用户信息的方法。
51 2
用户登录前后端开发(一个简单完整的小项目)——SpringBoot与session验证(带前后端源码)全方位全流程超详细教程
|
21天前
|
存储 缓存 数据处理
php学习笔记-php会话控制,cookie,session的使用,cookie自动登录和session 图书上传信息添加和修改例子-day07
本文介绍了PHP会话控制及Web常用的预定义变量,包括`$_REQUEST`、`$_SERVER`、`$_COOKIE`和`$_SESSION`的用法和示例。涵盖了cookie的创建、使用、删除以及session的工作原理和使用,并通过图书上传的例子演示了session在实际应用中的使用。
php学习笔记-php会话控制,cookie,session的使用,cookie自动登录和session 图书上传信息添加和修改例子-day07
|
1月前
|
存储 前端开发 Java
JavaWeb基础7——会话技术Cookie&Session
会话技术、Cookie的发送和获取、存活时间、Session钝化与活化、销毁、用户登录注册“记住我”和“验证码”案例
JavaWeb基础7——会话技术Cookie&Session
|
17天前
|
存储 安全 NoSQL
Cookie、Session、Token 解析
Cookie、Session、Token 解析
38 0
|
21天前
|
存储 搜索推荐 UED
探索研究Servlet Cookie 处理
【9月更文挑战第25天】
25 0
|
22天前
|
存储 JSON 数据安全/隐私保护
Cookie + Session 的时代已经过去了?
在探讨“Cookie + Session”这一经典组合是否已经过时的议题时,我们首先需要理解它们在Web应用认证和会话管理中的历史地位与当前面临的挑战。随着Web技术的飞速发展,特别是无状态服务、OAuth、JWT(JSON Web Tokens)等技术的兴起,这一传统机制确实面临了前所未有的变革压力。但说它“完全过去”或许过于绝对,因为它在特定场景下仍发挥着重要作用。
27 0
|
2月前
|
存储 JavaScript 前端开发
Cookie 反制策略详解:Cookie加解密原理、Cookie和Session机制、Cookie hook、acw_sc__v2、jsl Cookie调试、重定向Cookie
Cookie 反制策略详解:Cookie加解密原理、Cookie和Session机制、Cookie hook、acw_sc__v2、jsl Cookie调试、重定向Cookie
106 1
|
2月前
|
存储 安全 搜索推荐
【JavaWeb 秘籍】Cookie vs Session:揭秘 Web 会话管理的奥秘与实战指南!
【8月更文挑战第24天】本文以问答形式深入探讨了Web开发中关键的会话管理技术——Cookie与Session。首先解释了两者的基本概念及工作原理,随后对比分析了它们在存储位置、安全性及容量上的差异。接着,通过示例代码详细介绍了如何在JavaWeb环境中实现Cookie与Session的操作,包括创建与读取过程。最后,针对不同应用场景提供了选择使用Cookie或Session的指导建议,并提出了保障二者安全性的措施。阅读本文可帮助开发者更好地理解并应用这两种技术。
45 1
|
2月前
|
C# 开发者 Windows
WPF遇上Office:一场关于Word与Excel自动化操作的技术盛宴,从环境搭建到代码实战,看WPF如何玩转文档处理的那些事儿
【8月更文挑战第31天】Windows Presentation Foundation (WPF) 是 .NET Framework 的重要组件,以其强大的图形界面和灵活的数据绑定功能著称。本文通过具体示例代码,介绍如何在 WPF 应用中实现 Word 和 Excel 文档的自动化操作,包括文档的读取、编辑和保存等。首先创建 WPF 项目并设计用户界面,然后在 `MainWindow.xaml.cs` 中编写逻辑代码,利用 `Microsoft.Office.Interop` 命名空间实现 Office 文档的自动化处理。文章还提供了注意事项,帮助开发者避免常见问题。
148 0
|
5月前
|
Java 容器 Spring
SpringBoot2 | @SpringBootApplication注解 自动化配置流程源码分析(三)
SpringBoot2 | @SpringBootApplication注解 自动化配置流程源码分析(三)
56 0