【Spring MVC】如何获取cookie/session以及响应@RestController的理解,Header的设置

news2024/11/28 22:30:09

前言

🌟🌟本期讲解关于SpringMVC的编程之参数传递~~~

🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客

🔥 你的点赞就是小编不断更新的最大动力                                       

🎆那么废话不多说直接开整吧~~

目录

📚️1.请求

1.1了解Cookie与Session

1.2获取Cookie

1.传统的方式

2.注解的方式

1.3获取Session

1.传统的方式

2.注解的方式

1.4获取Header

1.传统的方式

2.注解的方式

📚️2.响应

2.1返回静态页面

2.2@RestController与@Controller的区别

2.3设置状态码

2.4设置Header

📚️3.总结


 

📚️1.请求

1.1了解Cookie与Session

回顾之前我们学习过的cookie,我们知道这是用于浏览器与页面存储某些信息的部分,而HTTP 协议⾃⾝是属于 "⽆状态" 协议

无状态:默认情况下 HTTP 协议的客⼾端和服务器之间的这次通信, 和下次通信之间没有直接的联系.

但是在实际开发中,在第一次用户登录后是要存储用户的信息的,第⼆次访问的时候服务器就能知道该请求是否是已经登陆过了.具体的情况就是如下所示:

解释:

上面的令牌就是存储在cookie中的,下次访问服务器的时候,就要带上cookie中的“令牌”,此时在服务器这边就需要记录"令牌"信息, 以及令牌对应的⽤⼾信息, 这个就是 Session 机制所做的⼯作. 

理解session
我们先来了解⼀下什么是会话.会话: 对话的意思

解释:

会话是⼀个客⼾与服务器之间的不中断的请求响应. 对客⼾的每个请求,服务器能够识别出请求来⾃于同⼀个客⼾.

当⼀个未知的客⼾向Web应⽤程序发送第⼀个请求时就开始了⼀个会话.当客⼾明确结束会话或服务器在⼀个时限内没有接受到客⼾的任何请求时,会话就结束了

总结:

服务器需要清楚的区分每个请求是属于哪个⽤⼾, 也就是属于哪个会话, 就需要在服务器这边记录每个会话以及与⽤⼾的信息的对应关系.

所以session就是服务器用来保存用户信息而创建的一个特殊的对象;

Session的本质就是⼀个 "哈希表", 存储了⼀些键值对结构. Key 就是SessionID, Value 就是⽤⼾信息(⽤⼾信息可以根据需求灵活设计

此时cookie和session就可以合作来完成这个过程:

解释:

1,首先客户端发送请求后,服务器就会返回创建一个session,然后把sessionID通过setcookie放回给客户端,存在客户端中cookie里。

2.当客户端第二次进行访问的时候,就会带上cookie,发送请求

3.此时服务器就会拿到里面的sessionID这个key,然后查找session这个对象,返回给客户端

这两者的区别:

• Cookie 是客⼾端保存⽤⼾信息的⼀种机制. Session 是服务器端保存⽤⼾信息的⼀种机制.
• Cookie 和 Session之间主要是通过 SessionId 关联起来的, SessionId 是 Cookie 和 Session 之间的桥梁
• Cookie 和 Session 经常会在⼀起配合使⽤. 但是不是必须配合.

1.2获取Cookie

1.传统的方式

代码如下所示:

 public String request10(HttpServletRequest request){
        Cookie[] cookies = request.getCookies();
        if(cookies!=null){
            Arrays.stream(cookies).forEach(cookie -> {
                System.out.println(cookie.getName()+":"+cookie.getValue());
            });
        }
        return "获取到cookie";
    }

解释:

Spring MVC是基于 Servlet API 构建的原始 Web 框架, 也是在Servlet的基础上实现的;

HttpServletRequest 对象代表客⼾端的请求, 当客⼾端通过HTTP协议访问服务器时,HTTP请
求头中的所有信息都封装在这个对象中

HttpServletResponse 对象代表服务器的响应. HTTP响应的信息都在这个对象中, ⽐如向客⼾
端发送的数据, 响应头, 状态码等

这里获取到cookie后,转化为数据流的方式,进行增强循环实现打印; 

当我们进行测试后:

此时就能够在下面的面板中得到这里的字符串,但是有由于没有设置,所以我们能够自己进行设置cookie的值,此时我们可以在浏览器中进行修改:

此时我们再次启动刷新·:

我们就可以在控制面板进行观察了~~

2.注解的方式

这里spring进行分装,此时就可以使用注解代替,但是这种方式只能获取指定的cookie,具体的代码就是如下所示:

  @RequestMapping("r11")
    public String request11(@CookieValue("nihao") String nihao){
        return "nihao的cookie值:"+nihao;
    }

此时我们就可以拿到cookie中“nihao”的value值:

那么就可以拿到返回的cookie值了;

1.3获取Session

我们知道session是服务器的,此时我们就不能在客户端浏览器进行修改,所以此时我们就在代码中先设置session的值,这里和上面的cookie大差不差;

@RequestMapping("r13")
    public String request13(HttpServletRequest request){
        HttpSession session=request.getSession();
        session.setAttribute("name","zhangsan");
        return "session设置成功";
    }

此时我们就可以通过httpservletrequest来进行设置;还有这里的session是一个键值对的形式,所以要有两个参数;

那么接下来我们就可以获取session了:

1.传统的方式
 @RequestMapping("r12")
    public String request(HttpServletRequest request){
         HttpSession session= request.getSession();
         String name=(String) session.getAttribute("name");
         return "获取到了session:"+name;
    }

这里也是通过HttpServletRequest 来进行操作,输入对应的key的值“value”来进行操作,我们进行postman进行测试获取:

那么就可以看到拿到了session的值,

2.注解的方式

此时和上面一致,进行了封装,那么此时我们就可以拿到session的值了,并且代码更加的简单

 @RequestMapping("r16")
    public String request16(@SessionAttribute("name") String name){
        return "获取到了session"+name;
    }

这里还是只能获取对应的key值的value,通过参数来接收这里的session的值;这里小编就不在进行演示了

注意:若没有获取到session的值,并且为null,很有可能就是刷新了浏览器,由于session是存储来内存中的,所以此时我们就要重新再次建立session,然后再获取session;

1.4获取Header

这里还是一样的,我们知道HttpServletRequest包含了所有请求头中的所有相关的信息,此时也可以通过这个来进行某个属性的获取;

1.传统的方式

代码如下:

 @RequestMapping("r17")
    public String request17(HttpServletRequest httpServletRequest){
        String contentType=httpServletRequest.getHeader("Content-Type");
        return contentType;
    }

注意:此时我们直接进行操作,是不会得到任何的数据,这里代表就是数据传输的方式,此时我们需要在postman中进行数据的编写:

此时我们再次点击发送,那么此时的数据传输就是JSON的格式了:

2.注解的方式

代码如下所示:

@RequestMapping("r18")
    public String request18(@RequestHeader("Content-Type") String contentType){
        return contentType;
    }

这里和上面几乎是一致的,还是一样的返回指定content-type,那么所以小编就不再进行演示和赘述了;

📚️2.响应

2.1返回静态页面

首先我们需要进行html的设置,代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Index⻚⾯</title>
</head>
<body>
 Hello,Spring MVC,我是Index⻚⾯.
</body>
</html>

此时我们规定的后端代码就是如下所示:

@RestController
@RequestMapping("response")
public class ResponseController {
    @RequestMapping("jump")
    public String response1(){
        return "/index.html";
    }

此时我们进行输出后,返回就是如下所示的:

此时我们想要返回的是一个html页面,结果这里当成了数据进行返回了,那么此时我们就可以通过更改注解名的方式进行操作

@Controller
@RequestMapping("response")
public class ResponseController {
    @RequestMapping("jump")
    public String response1(){
        return "/index.html";
    }

解释:

此时就是将上面的restcontroller进行了更改为controller,那么此时就可以进行html的页面的跳转了,那么这是问什么呢,下面小编将进行讲解

2.2@RestController与@Controller的区别

随着互联⽹的发展, ⽬前项⽬开发流⾏"前后端分离"模式, Java主要是⽤来做后端项⽬的开发, 所以也就不再处理前端相关的内容了
MVC的概念也逐渐发⽣了变化, View不再返回视图, ⽽是返回显⽰视图时需要的数据.

所以:@RestController 其实是返回的数据

@java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE})
@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@java.lang.annotation.Documented
@org.springframework.stereotype.Controller
@org.springframework.web.bind.annotation.ResponseBody
public @interface RestController {
    @org.springframework.core.annotation.AliasFor(annotation = org.springframework.stereotype.Controller.class)
    java.lang.String value() default "";
}

 解释:

上面的代码最重要的就是代表了如下:

@RestController = @Controller + @ResponseBody 

所以:如果想返回视图的话, 只需要把 @ResponseBody 去掉就可以了, 也就是 @Controller ,这里的@ResponseBody 代表就是返回数据据

注意: 

@ResponseBody:这既可以用作类,也可以用在方法上面,代表就是返回的是数据,如果上面的@RestController被@Controller代替后,想要返回数据,不是视图,那么就可以使用@ResponseBody加在方法上面;

@Controller不能用在方法上面,如下图所示:

2.3设置状态码

 Spring MVC会根据我们⽅法的返回结果⾃动设置响应状态码, 程序员也可以⼿动指定状态码
通过Spring MVC的内置对象HttpServletResponse 提供的⽅法来进⾏设置

代码如下:

 @RequestMapping("setstatus")
    @ResponseBody
    public String setstatus(HttpServletResponse httpServletResponse){
        httpServletResponse.setStatus(401);
        return "状态码设置成功";
    }

此时我们使用postman进行发送请求,用fiddler进行抓包:

可以发现,状态码本来因该是200,但是被修改后成为了401;所以状态码不一定会影响是否响应成功;

2.4设置Header

这里小编就直接步入正题吧:

我们首先看看这个@RequestMapping的内部的原码;

 java.lang.String name() default "";

    @org.springframework.core.annotation.AliasFor("path")
    java.lang.String[] value() default {};

    @org.springframework.core.annotation.AliasFor("value")
    java.lang.String[] path() default {};

    org.springframework.web.bind.annotation.RequestMethod[] method() default {};

    java.lang.String[] params() default {};

    java.lang.String[] headers() default {};

    java.lang.String[] consumes() default {};

    java.lang.String[] produces() default {};

解释:

1.value: 指定映射的URL
2. method: 指定请求的method类型, 如GET, POST等
3. consumes: 指定处理请求(request)的提交内容类型(Content-Type),例如application/json,
text/html;
4. produces: 指定返回的内容类型,还可以同时设置返回值的字符编码
5. Params: 指定request中必须包含某些参数值时,才让该⽅法处理
6. headers: 指定request中必须包含某些指定的header值,才能让该⽅法处理请求

其实在上面有几个是小编之前讲解到的,这里就举几个其他的例子:

produce:规定返回的内容的类型:

@RequestMapping(value = "/returnJson2",produces = "application/json")
    @ResponseBody
    public String returnJson2() {
        return "ji";
    }

 此时我们进行抓包处理:

可以看到此时就是JSON的格式;

method指定请求的方法:

@RequestMapping(value = "/method",method = RequestMethod.POST)
    public String method(){
        return "方法观察";
    }

此时我们使用postman进行发送请求

此时若为get方法,那么就会出现方法不被允许的错误,所以在我们更改请求的方法后:

我们进行抓包,可以看到此时的结果就是如下所示:

那么此时就是:抓包的结果,可以看到请求的方法就是post;

📚️3.总结

本期小编主要讲解了关于cookie和session的概念和如何进行获取的操作,这里包括了传统的代码编写方式,以及注解的代码编写的方式;还讲解了响应中比较重要的@RestController的概念理解,和状态码,Header的设置;

🌅🌅🌅~~~~最后希望与诸君共勉,共同进步!!!


💪💪💪以上就是本期内容了, 感兴趣的话,就关注小编吧。

                 😊😊  期待你的关注~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2249341.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用 exe4j 将 Spring Boot 项目打包为 EXE 可执行文件

使用 exe4j 将 Spring Boot 项目打包为 EXE 可执行文件 文章目录 使用 exe4j 将 Spring Boot 项目打包为 EXE 可执行文件什么是 exe4j准备工作打包 Spring Boot 项目为 EXE 文件1.启动 exe4j2. 选择项目类型3. 配置项目名称和输出目录4. 配置项目类型或可执行文件名称5. java配…

前端JavaScript(一)---基本介绍

Javascript是一种由Netscape(网景)的LiveScript发展而来的原型化继承的面向对象的动态类型的区分大小写的客户端脚本语言&#xff0c;主要目的是为了解决服务器端语言&#xff0c;比如Perl&#xff0c;遗留的速度问题&#xff0c;为客户提供更流畅的浏览效果。当时服务端需要对…

阿里Qwen系列开源模型介绍

模型种类丰富 Qwen2&#xff1a;包含Qwen2-0.5b、Qwen2-1.5b、Qwen2-7b、Qwen2-57b-a14b以及Qwen2-72b等五种规模的预训练和指令微调模型&#xff0c;其在多语言处理、长文本处理、代码生成、数学和逻辑推理等能力上&#xff0c;在mmlu、gpqa、humaneval等国际测评中得到了验证…

基于Java的小程序电商商城开源设计源码

近年来电商模式的发展越来越成熟&#xff0c;基于 Java 开发的小程序电商商城开源源码&#xff0c;为众多开发者和企业提供了构建个性化电商平台的有力工具。 基于Java的电子商城购物平台小程序的设计在手机上运行&#xff0c;可以实现管理员&#xff1b;首页、个人中心、用户…

开源 AI 智能名片 2 + 1 链动模式 S2B2C 商城小程序源码助力品牌共建:价值、策略与实践

摘要&#xff1a;在当今数字化商业环境下&#xff0c;品牌构建已演变为企业与消费者深度共建的过程。本文聚焦于“开源 AI 智能名片 2 1 链动模式 S2B2C 商城小程序源码”&#xff0c;探讨其如何融入品牌建设&#xff0c;通过剖析品牌价值构成&#xff0c;阐述该技术工具在助力…

力扣797. 所有可能的路径

算法思想 深度优先搜索&#xff08;DFS&#xff09;&#xff1a; 使用递归从节点 0 开始&#xff0c;探索所有从当前节点到终点 n−1 的路径。每次访问一个节点时&#xff0c;将该节点加入当前路径 path。 回溯法&#xff1a; 在递归返回时&#xff0c;通过 path.pop_back()…

AMD(Xilinx) FPGA配置Flash大小选择

目录 1 FPGA配置Flash大小的决定因素2 为什么选择的Flash容量大小为最小保证能够完成整个FPGA的配置呢&#xff1f; 1 FPGA配置Flash大小的决定因素 在进行FPGA硬件设计时&#xff0c;选择合适的配置Flash是我们进行硬件设计必须考虑的&#xff0c;那么配置Flash大小的选择由什…

Git简单介绍

一、 Git介绍与安装 1.1 Git简介 Git是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。 1.2集中式(SVN&#xff09; VS 分布式(git) 集中式版本控制系统&#xff0c;版本库是集中存放在中央服务器的&#xff0c;工作时要先从中央…

FreeSWITCH 简单图形化界面34 - 网络环境安全的情况下,进行任意SIP注册

FreeSWITCH 简单图形化界面34 -网络环境安全的情况下&#xff0c;进行任意SIP注册 测试环境1、前言2、参数3、实践一下 测试环境 http://myfs.f3322.net:8020/ 用户名&#xff1a;admin&#xff0c;密码&#xff1a;admin FreeSWITCH界面安装参考&#xff1a;https://blog.cs…

力扣 二叉树的层序遍历-102

二叉树的层序遍历-102 class Solution { public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> res; // 二维数组用来存储每层节点if (root nullptr)return res;queue<TreeNode*> q; // 队列用来进行层序遍历q.push(r…

鸿蒙学习使用本地真机运行应用/元服务 (开发篇)

文章目录 1、前提条件2、使用USB连接方式3、使用无线调试连接方式4、运行 1、前提条件 在Phone和Tablet中运行HarmonyOS应用/元服务的操作方法一致&#xff0c;可以采用USB连接方式或者无线调试的连接方式。两种连接方式是互斥的&#xff0c;只能使用一种&#xff0c;无法同时…

数据库导论

data 数据是数据库中存储的基本数据&#xff0c;描述事物的符号称为数据。 DB 数据库是长期存储在计算机内&#xff0c;有组织&#xff0c;可共享的大量数据的集合。数据库中的数据按照一定的数据模型组织&#xff0c;描述和存储&#xff0c;具有较小的冗余度&#xff0c;较…

数据结构 ——— 归并排序算法的实现

目录 归并排序的思想 归并排序算法的实现 归并排序的思想 将已经有序的子序列合并&#xff0c;得到完全有序的序列&#xff0c;即先使每个子序列有序后&#xff0c;再使子序列段间有序 若将两个有序表合并成一个有序表&#xff0c;称为二路归并 归并排序步骤示意图&#x…

【数据结构】【线性表】一文讲完队列(附C语言源码)

队列 队列的基本概念基本术语基本操作 队列的顺序实现顺序队列结构体的创建顺序队列的初始化顺序队列入队顺序队列出队顺序队列存在的问题分析循环队列代码汇总 队列的链式实现链式队列的创建链式队列初始化-不带头结点链式队列入队-不带头节点链式队列出队-不带头结点带头结点…

chrome允许http网站打开摄像头和麦克风

第一步 chrome://flags/#unsafely-treat-insecure-origin-as-secure 第二步 填入网址&#xff0c;点击启用 第三步 重启 Chrome&#xff1a;设置完成后&#xff0c;点击页面底部的 “Relaunch” 按钮&#xff0c;重新启动 Chrome 浏览器&#xff0c;使更改生效。

Spring Boot教程之十: 使用 Spring Boot 实现从数据库动态下拉列表

使用 Spring Boot 实现从数据库动态下拉列表 动态下拉列表&#xff08;或依赖下拉列表&#xff09;的概念令人兴奋&#xff0c;但编写起来却颇具挑战性。动态下拉列表意味着一个下拉列表中的值依赖于前一个下拉列表中选择的值。一个简单的例子是三个下拉框&#xff0c;分别显示…

DRM(数字权限管理技术)防截屏录屏----视频转hls流加密、web解密播放

提示&#xff1a;视频转hls流加密、web解密播放 需求&#xff1a;研究视频截屏时&#xff0c;播放器变黑&#xff0c;所以先研究的视频转hls流加密 文章目录 [TOC](文章目录) 前言一、工具ffmpeg、openssl二、后端nodeexpress三、web播放四、文档总结 前言 ‌HLS流媒体协议‌&a…

视觉经典神经网络与复现:深入解析与实践指南

目录 引言 经典视觉神经网络模型详解 1. LeNet-5&#xff1a;卷积神经网络的先驱 LeNet-5的关键特点&#xff1a; 2. AlexNet&#xff1a;深度学习的突破 AlexNet的关键特点&#xff1a; 3. VGGNet&#xff1a;深度与简洁的平衡 VGGNet的关键特点&#xff1a; 4. ResNe…

【算法day1】数组:双指针算法

题目引用 这里以 1、LeetCode704.二分查找 2、LeetCode27.移除元素 3、LeetCode977.有序数组的平方 这三道题举例来说明数组中双指针的妙用。 1、二分查找 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜…

华为云云连接+squid进行正向代理上网冲浪

1 概述 ‌Squid‌是一个高性能的代理缓存服务器&#xff0c;主要用于缓冲Internet数据。它支持多种协议&#xff0c;包括FTP、gopher、HTTPS和HTTP。Squid通过一个单独的、非模块化的、I/O驱动的进程来处理所有的客户端请求&#xff0c;这使得它在处理请求时具有较高的效率‌。…