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

前言

🌟🌟本期讲解关于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")@ResponseBodypublic 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")@ResponseBodypublic 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.rhkb.cn/news/479590.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【详细介绍及演示】Flink之checkpoint检查点的使用

目录 一、介绍 二、 设置checkpoint检查点演示 1、 代码演示 2、测试代码效果 3、查看快照情况 ​编辑 三、在集群上运行 1、第一次运行 2、第二次运行 四、自定义检查点savePoint 1、提交一个flink job 打成jar包 2、输入一些数据&#xff0c;观察单词对应的数字的…

JAVA篇05 —— 内部类(Local、Anonymous、Member、Static)

欢迎来到我的主页&#xff1a;【一只认真写代码的程序猿】 本篇文章收录于专栏【小小爪哇】 如果这篇文章对你有帮助&#xff0c;希望点赞收藏加关注啦~ 目录 1 内部类Inner Class 1.1 局部内部类 1.2 匿名内部类&#xff08;※※&#xff09; 1.3 匿名类最佳实践&#xf…

Spring Boot 与 Spring Cloud Alibaba 版本兼容对照

版本选择要点 Spring Boot 3.x 与 Spring Cloud Alibaba 2022.0.x Spring Boot 3.x 基于 Jakarta EE&#xff0c;javax.* 更换为 jakarta.*。 需要使用 Spring Cloud 2022.0.x 和 Spring Cloud Alibaba 2022.0.x。 Alibaba 2022.0.x 对 Spring Boot 3.x 的支持在其发行说明中…

jsp的pageContext对象

jsp的pageContext对象 是页面的上下文对象&#xff0c;表示当前页面运行环境&#xff0c;用于获取当前页面jsp页面信息&#xff0c;作用范围为当前的jsp页面 pageContext对象可以访问当前页面的所有jsp内置对象 jsp的四种内置对象 4中作用域&#xff1a;pagecontext,request…

网络安全在数字时代保护库存数据中的作用

如今&#xff0c;通过软件管理库存已成为一种标准做法。企业使用数字工具来跟踪库存水平、管理供应链和规划财务。 然而&#xff0c;技术的便利性也带来了网络威胁的风险。黑客将库存数据视为有价值的目标。保护这些数据不仅重要&#xff0c;而且必不可少。 了解网络安全及其…

Python图像处理:打造平滑液化效果动画

液化动画中的强度变化是通过在每一帧中逐渐调整液化效果的强度参数来实现的。在提供的代码示例中&#xff0c;强度变化是通过一个简单的线性插值方法来控制的&#xff0c;即随着动画帧数的增加&#xff0c;液化效果的强度也逐渐增加。 def liquify_image(image, center, radius…

day2全局注册

全局注册代码&#xff1a; //文件核心作用&#xff1a;导入App.vue,基于App.vue创建结构渲染index.htmlimport Vue from vue import App from ./App.vue //编写导入的代码&#xff0c;往代码的顶部编写&#xff08;规范&#xff09; import HmButton from ./components/Hm-But…

wireshark基础

免责声明&#xff1a; 笔记的只是方便各位师傅学习知识&#xff0c;以下代码、网站只涉及学习内容&#xff0c;其他的都与本人无关&#xff0c;切莫逾越法律红线&#xff0c;否则后果自负。 泷羽sec官网&#xff1a;https://longyusec.com/ 泷羽sec B站地址&#xff1a;https:/…

学习笔记037——Java中【Synchronized锁】

文章目录 1、修饰方法1.1、静态方法&#xff0c;锁定的是类1.2、非静态方法&#xff0c;锁定的是方法的调用者&#xff08;对象&#xff09; 2、修饰代码块&#xff0c;锁定的是传入的对象2.1、没有锁之前&#xff1a;2.2、有锁后&#xff1a; 实现线程同步&#xff0c;让多个线…

⭐️ GitHub Star 数量前十的工作流项目

文章开始前&#xff0c;我们先做个小调查&#xff1a;在日常工作中&#xff0c;你会使用自动化工作流工具吗&#xff1f;&#x1f64b; 事实上&#xff0c;工作流工具已经变成了提升效率的关键。其实在此之前我们已经写过一篇博客&#xff0c;跟大家分享五个好用的工作流工具。…

智能桥梁安全运行监测系统守护桥梁安全卫士

一、方案背景 桥梁作为交通基础设施中不可或缺的重要组成部分&#xff0c;其安全稳定的运行直接关联到广大人民群众的生命财产安全以及整个社会的稳定与和谐。桥梁不仅是连接两地的通道&#xff0c;更是经济发展和社会进步的重要纽带。为了确保桥梁的安全运行&#xff0c;桥梁安…

[创业之路-155] :《领先的密码-BLM方法论全面解读与应用指南》- 综合管理框架

目录 一、BLM&#xff08;业务领先模型&#xff09;综合管理框架 1、BLM模型的起源与发展 2、BLM模型的核心组成 3、BLM模型的战略规划与执行流程 4、BLM模型的应用价值 二、BLM&#xff08;业务领先模型&#xff09;实施案例 1. 华为的实施案例 2. 某知名企业A的实施案…

用Java爬虫“搜刮”工厂数据:一场数据的寻宝之旅

引言&#xff1a;数据的宝藏 在这个数字化的时代&#xff0c;数据就像是隐藏在数字丛林中的宝藏&#xff0c;等待着勇敢的探险家去发掘。而我们&#xff0c;就是那些手持Java魔杖的现代海盗&#xff0c;准备用我们的爬虫船去征服那些数据的海洋。今天&#xff0c;我们将一起踏…

redis 底层数据结构

概述 Redis 6 和 Redis 7 之间对比&#xff1a; Redis6 和 Redis7 最大的区别就在于 Redis7 已经用 listpack 替代了 ziplist. 以下是基于 Redis 7基础分析。 RedisObject Redis是⼀个<k,v>型的数据库&#xff0c;其中key通常都是string类型的字符串对象&#xff0c;⽽…

UE5 实现组合键触发事件的方法

因为工作原因。 需要用大括号{和}来触发事件 但是在蓝图中搜了一下&#xff0c;发现键盘事件里根本就没有{}这两个键。 花费了一下午&#xff0c;终于找到解决的方法了&#xff0c;也就是增强输入的弦操作 首先创建一个项目 纯蓝图或者C都可行 进入到内容浏览器的默认页面 …

使用Github Action将Docker镜像转存到阿里云私有仓库,供国内服务器使用,免费易用

文章目录 一、前言二、 工具准备&#xff1a;三、最终效果示例四、具体步骤第一大部分是配置阿里云1. 首先登录阿里云容器镜像服务 [服务地址](https://cr.console.aliyun.com/cn-hangzhou/instances)2. 选择个人版本3. 创建 命名空间4. 进入访问凭证来查看&#xff0c;用户名字…

用两个栈实现队列 剑指offer

题目描述 用两个栈实现一个队列。队列声明如下图&#xff0c;请实现它的两个函数appendTail和deleteHead,分别完成在队尾插入节点和队头删除节点的功能。 代码实现 测试用例 相关题目

本地推流,服务器拉流全流程

本地推流&#xff0c;服务器拉流全流程 环境准备&#xff1a;准备一台服务器&#xff0c;其中openssl最好为1.1.1版本&#xff08;可以直接使用ubuntu20.04操作系统&#xff09; 服务器拉流 1、 安装环境依赖 sudo apt-get update sudo apt-get install unzip sudo apt-get…

打开windows 的字符映射表

快捷键 win R 打开资源管理器 输入: charmap 点击确定

Elasticsearch对于大数据量(上亿量级)的聚合如何实现?

大家好&#xff0c;我是锋哥。今天分享关于【Elasticsearch对于大数据量&#xff08;上亿量级&#xff09;的聚合如何实现&#xff1f;】面试题。希望对大家有帮助&#xff1b; Elasticsearch对于大数据量&#xff08;上亿量级&#xff09;的聚合如何实现&#xff1f; 1000道 …