Cookie/Session

1.Cookie

HTTP 协议自身是属于 "无状态" 协议.
"无状态" 的含义指的是:
默认情况下 HTTP 协议的客户端和服务器之间的这次通信, 和下次通信之间没有直接的联系.
但是实际开发中, 我们很多时候是需要知道请求之间的关联关系的.
例如登陆网站成功后, 第二次访问的时候服务器就能知道该请求是否是已经登陆过了.

上述图中的 "令牌" 通常就存储在 Cookie 字段中.

此时在服务器这边就需要记录"令牌"信息, 以及令牌对应的用户信息, 这个就是 Session 机制所做的工作。
理解Session
我们先来了解⼀下什么是会话.
会话: 对话的意思

 

在计算机领域, 会话是⼀个客户与服务器之间的不中断的请求响应.
对客户的每个请求,服务器能够识别出请求来自于同⼀个客户.
当⼀个未知的客户向Web应用程序发送第⼀个请求时就开始了⼀个会话.
当客户明确结束会话或服务器在⼀个时限内没有接受到客⼾的任何请求时,会话就结束了.

比如我们打客服电话
每次打客服电话, 是⼀个会话. 挂断电话, 会话就结束了
下次再打客服电话, ⼜是⼀个新的会话.
如果我们⻓时间不说话, 没有新的请求, 会话也会结束

服务器同⼀时刻收到的请求是很多的.

服务器需要清楚的区分每个请求是从属于哪个用户, 也就是属于哪个会话, 就需要在服务器这边记录每个会话以及与用户的信息的对应关系.(不同的用户所接受的服务是不同的,session存取着用户的信息)

2.Session

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

Session的本质就是⼀个 "哈希表", 存储了⼀些键值对结构.

Key 就是SessionID, Value 就是用户信息(用户信息可以根据需求灵活设计) 

SessionId 是由服务器生成的⼀个 "唯⼀性字符串",
从 Session 机制的角度来看, 这个唯⼀性字符串称 为 "SessionId".
但是站在整个登录流程中看待, 也可以把这个唯⼀性字符串称为 "token".
上述例子中的令牌ID, 就可以看做是SessionId, 只不过令牌除了ID之外, 还会带⼀些其他信息, 比如时间, 签名等.

 1. 当用户登陆的时候, 服务器在 Session 中新增⼀个新记录, 并把 sessionId返回给客户端. (通过
HTTP 响应中的 Set-Cookie 字段返回).--服务器生成一个session,并将sessionid返回给客户端
2. 客户端后续再给服务器发送请求的时候, 需要在请求中带上 sessionId. (通过 HTTP 请求中的
Cookie 字段带上
).
3. 服务器收到请求之后, 根据请求中的 sessionId在 Session 信息中获取到对应的用户信息, 再进行后续操作.

找不到则重新创建Session, 并把SessionID返回

Session 默认是保存在内存中的. 如果重启服务器则 Session 数据就会丢失.  

Cookie 和 Session 的区别
• Cookie 是客户端保存用户信息的⼀种机制. Session 是服务器端保存用户信息的⼀种机制.
• Cookie 和 Session之间主要是通过 SessionId 关联起来的, SessionId 是 Cookie 和 Session 之间的桥梁
• Cookie 和 Session 经常会在⼀起配合使用. 但是不是必须配合.
◦ 完全可以用 Cookie 来保存⼀些数据在客户端. 这些数据不⼀定是用户身份信息, 也不⼀定是
SessionId
◦ Session 中的sessionId 也不需要⾮得通过 Cookie/Set-Cookie 传递, ⽐如通过URL传递. 

 3.Cookie的获取方式

  • Spring MVC是基于 Servlet API 构建的原始 Web 框架, 也是在Servlet的基础上实现的。
  • HttpServletRequest , HttpServletResponse 是Servlet提供的两个类, 是Spring MVC⽅法的内置对象. 需要时直接在方法中添加声明即可。
  • HttpServletRequest 对象代表客⼾端的请求, 当客⼾端通过HTTP协议访问服务器时,HTTP请
  • 求头中的所有信息都封装在这个对象中,通过这个对象提供的⽅法,可以获得客⼾端请求的所有信
  • HttpServletResponse 对象代表服务器的响应. HTTP响应的信息都在这个对象中, 比如向客户端发送的数据, 响应头, 状态码等. 通过这个对象提供的⽅法, 可以获得服务器响应的所有内容
  • Spring MVC在这两个对象的基础上进⾏了封装, 给我们提供更加简单的使用方法.

3.1 cookie的伪造方式 

1.postman的cookie设置

 

2.简洁获取Cookie 

@RequestMapping("/get")
@RestController
public class Method {
    @RequestMapping("/cookie")
    public String getCookie(@CookieValue("cookie") String cookie){
        if(cookie==null){
            return "你没有设置cookie值";
        }else{
            return "获取的cookie值:"+cookie;
        }

    }
}

4.Session  

4.1 存储和获取session

Session 存储和获取

Session是服务器端的机制, 我们需要先存储, 才能再获取

Session 也是基于HttpServletRequest 来存储和获取的

    @RequestMapping("/setSession")
    public String setSession(HttpServletRequest request){
        HttpSession httpSession=request.getSession();
        if(httpSession!=null){
            httpSession.setAttribute("userNanme","lay");
//前面是存储的名字,后面是你要存的东西。我们通过前者拿session
//前者是sessionid后者是value
        }
        return "session设置成功";
    }

 这个代码中看不到 SessionId 这样的概念的. getSession 操作内部提取到请求中的Cookie ⾥的
SessionId, 然后根据SessionId获取到对应的Session 对象, Session 对象⽤HttpSession来描述

 获取Session有两种⽅式

HttpSession getSession ( boolean create);
HttpSession getSession ();
HttpSession getSession(boolean create) :
参数如果为 true, 则当不存在会话时新建会话;
参数如果 为 false, 则当不存在会话时返回 null
HttpSession getSession(): 和getSession(true) 含义⼀样, 默认值为true.
void setAttribute(String name, Object value): 使⽤指定的名称绑定⼀个对象到该 session 会话

 4.2 session读取

读取 Session 可以使⽤ HttpServletRequest

    @RequestMapping("/getSess")
    public String sess(HttpServletRequest request) {
        // 如果 session 不存在, 不会⾃动创建
        HttpSession session = request.getSession(false);
        String username = null;
        if (session != null && session.getAttribute("username") != null) {
            username = (String) session.getAttribute("username");
        }
        return "username:" + username;
    }

此时我们来读取session,发现为空,那是因为我们并没有存进去。 

我们设置的sessionid是userName,而我们读取的是username。通过改变4.1的代码来看结果。

 

设置成功!!!

简洁写法

    @RequestMapping("/setSession1")
    public String setSession1(HttpSession httpSession){
        if(httpSession!=null){
            httpSession.setAttribute("username","lay");//前面是存储的名字,后面是你要存的东西。我们通过前者拿session
        }
        return "session设置成功";
    }

    @RequestMapping("/getSession1")
    public String getSess1(HttpSession session) {
        // 如果 session 不存在, 不会⾃动创建
        String username = null;
        if (session != null && session.getAttribute("username") != null) {
            username = (String) session.getAttribute("username");
        }
        System.out.println(username);
        return "username:" + username;
    }

 同样是成功的!!!

5.获取header 

    @RequestMapping("/header")
    public String header(@RequestHeader("User-Agent") String userAgent) {
        return "userAgent:"+userAgent;
    }

//记住@绑定时,前者是改正前,后者是改正后。

//我们返回的是后者

6.设置状态码

Spring MVC会根据我们⽅法的返回结果⾃动设置响应状态码,

程序员也可以⼿动指定状态码

通过Spring MVC的内置对象HttpServletResponse 提供的⽅法来进⾏设置

 通过Fiddler来观察设置的结果:

状态码不影响⻚⾯的展⽰ 

7 设置header

这些信息通过 @RequestMapping 注解的属性来实现
先来看 @RequestMapping 的源码

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
    String name() default "";

    @AliasFor("path")
    String[] value() default {};

    @AliasFor("value")
    String[] path() default {};

    RequestMethod[] method() default {};

    String[] params() default {};

    String[] headers() default {};

    String[] consumes() default {};

    String[] produces() default {};
}

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

7.1 设置Content-Type

我们通过设置 produces属性的值, 设置响应的报头Content-Type

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

7.2 设置其他Header

设置其他Header的话, 需要使⽤Spring MVC的内置对象HttpServletResponse 提供的⽅法来进⾏设置 

@RequestMapping(value = "/setHeader")
@ResponseBody
public String setHeader(HttpServletResponse response) {
 response.setHeader("MyHeader","MyHeaderValue");
 return "设置Header成功";
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

004 高并发内存池_ThreadCache设计

​🌈个人主页:Fan_558 🔥 系列专栏:高并发内存池 🌹关注我💪🏻带你学更多知识 文章目录 前言文章重点一、设计FreeList自由链表结构二、定制对齐映射规则三、完成申请Allocate与释放Deallocate…

数据结构:链表的双指针技巧

文章目录 一、链表相交问题二、单链表判环问题三、回文链表四、重排链表结点 初学双指针的同学,请先弄懂删除链表的倒数第 N 个结点。 并且在学习这一节时,不要将思维固化,认为只能这样做,这里的做法只是技巧。 一、链表相交问题 …

【免费获取】【下片神器】IDM非主流网站视频免费下载神器IDM+m3u8并解决idm下载失败问题 idm下载器超长免费试用

当你浏览一个网站,看到一个喜欢的视频,不知道如何下载的时候,本教程或许可以帮你点小忙。大部分的主流网站都有专门的下载工具,本篇教程主要针对的是一些非主流的小网站。 我们的下载方法就是利用IDM(Internet Downlo…

npm卸载不掉的解决方案

不管怎么重装重启都报错 真服了,npm卸载不掉绝对是有缓存存在,用where npm查到d盘 实际上根本不在这个地方,这个是我安装的6.14.12版本的npm的地方,我说我怎么怎么重装怎么导包都不行呢,偷偷隐藏在这个目录里面&#…

Unity 学习日记 13.地形系统

下载源码 UnityPackage 1.地形对象Terrain 目录 1.地形对象Terrain 2.设置地形纹理 3.拔高地形地貌 4. 绘制树和草 5.为地形加入水 6.加入角色并跑步 7.加入水声 右键创建3D地形: 依次对应下面的按钮 || 2.设置地形纹理 下载资源包 下载资源包后&#x…

【Ubuntu】文件和目录的增、删、改、查操作

这里写目录标题 (一)文件和目录类命令的使用1、目录与文件的增加(1)目录的增加 :(2)文件的增加 2、目录与文件的删除(1)目录和文件的删除 3、目录与文件的修改(1)mv命令 4、目录与文…

【跟着CHATGPT学习硬件外设 | 01】SPI

文章目录 🚀 概念揭秘关键精华🌟 秒懂案例生活类比实战演练 🔍 原理与工作流程探秘步骤1:初始化SPI接口步骤2:主设备启动通信步骤3:主设备发送数据步骤4:从设备接收数据步骤5:从设备…

Zookeeper(九)客户端的启动流程

目录 一 ZooKeeper会话的创建与连接1.1 会话的创建1.1.1 ClientWatchManager1.1.2 ConnectStringParser1.1.3 HostProvider1.1.4 ClientCnxn 1.2 会话的连接1.2.1 SendThread1.2.2 eventThread 二 ZooKeeper会话的响应2.1 接受服务端响应 三 ClientCnxn 详解3.1 Packet3.2 队列…

一文彻底搞懂并发容器

文章目录 1. 什么是并发容器2. 并发容器的分类 1. 什么是并发容器 并发容器是一种用于多线程环境的数据结构,它们能够有效地处理并发访问和修改的问题。在多线程应用程序中,多个线程可能会同时访问和修改共享的数据结构,这可能会导致数据不一…

一文教你如何轻松领取阿里云优惠券

随着云计算技术的飞速发展,越来越多的企业和个人选择使用阿里云作为他们的云服务提供商。为了吸引更多的用户上云,阿里云推出了各种优惠券和促销活动。本文将教大家如何轻松领取阿里云优惠券,以便在购买阿里云产品和服务时享受更多优惠。 一、…

激发数据潜力:企业数据中台的策略性构建与优化_光点科技

在信息时代,数据是企业价值链中不可或缺的一环。构建一个策略性的企业数据中台不仅能够整合分散的数据资源,还能提高决策效率和业务敏捷性。本文聚焦于如何策略性地构建和优化数据中台,以便企业能够最大化地利用数据资源,推动企业…

Sora是否能颠覆视频制作行业?一文带你了解

一个月前OpenAI宣布了一款名为Sora的新生成式人工智能系统,该系统可以根据文本提示生成短视频。虽然Sora尚未向公众开放,但迄今为止发布的高质量样本已经引起了兴奋和担忧的反应。 OpenAI发布的样本视频(该公司称这些视频是由Sora直接制作&am…

反应式编程(三)什么是粘包、拆包?如何解决?

目录 一、粘包、拆包介绍1.1 什么是 TCP 协议?1.2 什么是粘包、拆包?1.3 粘包、拆包的四种情况1.4 粘包、拆包的原因1)TCP协议中的滑动窗口机制2)传输层的 MSS 与链路层的 MTU3)TCP协议中的 Nagle 算法4)应…

【智能算法】晶体结构算法(CryStAl)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2021年,S Talatahari等人受到晶体自然结构启发,提出了晶体构造算法(Crystal Structure Algorithm , CryStAl)。 2.算法原理 2.1算法思想 CryStAl受…

Python学习笔记-简单案例实现多进程与多线程

Python 的多进程与多线程是并发编程的两种重要方式,用于提高程序的执行效率。它们各自有不同的特点和适用场景。 多进程(Multiprocessing) 概念: 多进程是指操作系统中同时运行多个程序实例,每个实例称为一个进程。…

Jmeter 分布式压测,你的系统能否承受高负载?

‍你可以使用 JMeter 来模拟高并发秒杀场景下的压力测试。这里有一个例子,它模拟了同时有 5000 个用户,循环 10 次的情况‍。 请求默认配置 token 配置 秒杀接口 ​结果分析 ​但是,实际企业中,这种压测方式根本不满足实际需求。下…

java入门学习Day03

本篇文章主要有java中的变量、命名方法、数据类型。 一、java中的变量 数据类型 变量名 数据值;int money 50; public class varibledemo {public static void main(String[] args) {int money 50;//变量的输出System.out.println(money);money 6…

ctfshow-web入门-xxe

什么是xxe? XXE,全称XML External Entity Injection,即XML外部实体注入。这是一种针对应用程序解析XML输入类型的攻击。当包含对外部实体的引用的XML输入被弱配置的XML解析器处理时,就会发生这种攻击。这种攻击通过构造恶意内容&…

bugku-web-alert

这里可以看到flag在页面弹窗内 有两种弹窗 利用Python和bp各自尝试 得到的结果 这里得到一串不知道是什么的加密代码 经过尝试大量解码器后得知,这时unicode编码 进行解码

Linux中的文件操作

共识原理 在讲文件操作之前, 我们先形成一个共识 1 文件 内容 属性 2 文件分为打开的文件 和 没打开的文件 3 打开的文件是谁打开的? 进程!! – 研究文件操作本质是研究进程和文件的关系! 4 没打开的文件&#xff1…