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;
    }
目录
相关文章
|
2天前
|
前端开发 Java
表白墙/留言墙 —— 初级SpringBoot项目,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
文章通过一个表白墙/留言墙的初级SpringBoot项目实例,详细讲解了如何进行前后端开发,包括定义前后端交互接口、创建SpringBoot项目、编写前端页面、后端代码逻辑及实体类封装的全过程。
11 3
表白墙/留言墙 —— 初级SpringBoot项目,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
|
2天前
|
前端开发 Java 数据安全/隐私保护
用户登录前后端开发(一个简单完整的小项目)——SpringBoot与session验证(带前后端源码)全方位全流程超详细教程
文章通过一个简单的SpringBoot项目,详细介绍了前后端如何实现用户登录功能,包括前端登录页面的创建、后端登录逻辑的处理、使用session验证用户身份以及获取已登录用户信息的方法。
25 2
用户登录前后端开发(一个简单完整的小项目)——SpringBoot与session验证(带前后端源码)全方位全流程超详细教程
|
14天前
|
JavaScript Java 关系型数据库
毕设项目&课程设计&毕设项目:基于springboot+vue实现的在线考试系统(含教程&源码&数据库数据)
本文介绍了一个基于Spring Boot和Vue.js实现的在线考试系统。随着在线教育的发展,在线考试系统的重要性日益凸显。该系统不仅能提高教学效率,减轻教师负担,还为学生提供了灵活便捷的考试方式。技术栈包括Spring Boot、Vue.js、Element-UI等,支持多种角色登录,具备考试管理、题库管理、成绩查询等功能。系统采用前后端分离架构,具备高性能和扩展性,未来可进一步优化并引入AI技术提升智能化水平。
毕设项目&课程设计&毕设项目:基于springboot+vue实现的在线考试系统(含教程&源码&数据库数据)
|
16天前
|
Java 关系型数据库 MySQL
毕设项目&课程设计&毕设项目:springboot+jsp实现的房屋租租赁系统(含教程&源码&数据库数据)
本文介绍了一款基于Spring Boot和JSP技术的房屋租赁系统,旨在通过自动化和信息化手段提升房屋管理效率,优化租户体验。系统采用JDK 1.8、Maven 3.6、MySQL 8.0、JSP、Layui和Spring Boot 2.0等技术栈,实现了高效的房源管理和便捷的租户服务。通过该系统,房东可以轻松管理房源,租户可以快速找到合适的住所,双方都能享受数字化带来的便利。未来,系统将持续优化升级,提供更多完善的服务。
毕设项目&课程设计&毕设项目:springboot+jsp实现的房屋租租赁系统(含教程&源码&数据库数据)
|
2天前
|
前端开发 Java 数据库连接
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
本文是一份全面的表白墙/留言墙项目教程,使用SpringBoot + MyBatis技术栈和MySQL数据库开发,涵盖了项目前后端开发、数据库配置、代码实现和运行的详细步骤。
7 0
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
|
2天前
|
存储 JSON 算法
JWT令牌基础教程 全方位带你剖析JWT令牌,在Springboot中使用JWT技术体系,完成拦截器的实现 Interceptor (后附源码)
文章介绍了JWT令牌的基础教程,包括其应用场景、组成部分、生成和校验方法,并在Springboot中使用JWT技术体系完成拦截器的实现。
5 0
JWT令牌基础教程 全方位带你剖析JWT令牌,在Springboot中使用JWT技术体系,完成拦截器的实现 Interceptor (后附源码)
|
2天前
|
Java 数据库连接 mybatis
Springboot整合Mybatis,MybatisPlus源码分析,自动装配实现包扫描源码
该文档详细介绍了如何在Springboot Web项目中整合Mybatis,包括添加依赖、使用`@MapperScan`注解配置包扫描路径等步骤。若未使用`@MapperScan`,系统会自动扫描加了`@Mapper`注解的接口;若使用了`@MapperScan`,则按指定路径扫描。文档还深入分析了相关源码,解释了不同情况下的扫描逻辑与优先级,帮助理解Mybatis在Springboot项目中的自动配置机制。
Springboot整合Mybatis,MybatisPlus源码分析,自动装配实现包扫描源码
|
14天前
|
存储 搜索推荐 UED
探索研究Servlet Cookie 处理
【9月更文挑战第25天】
22 0
|
XML Java 数据格式
SpringBoot——SpringBoot中使用Servlet的两种方式
SpringBoot——SpringBoot中使用Servlet的两种方式
SpringBoot——SpringBoot中使用Servlet的两种方式
|
16天前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的服装商城管理系统
基于Java+Springboot+Vue开发的服装商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的服装商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
47 2
基于Java+Springboot+Vue开发的服装商城管理系统