JAVAEE之Cookie/Session

news2024/11/18 14:38:18

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成功";
}

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

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

相关文章

绩效考核存在合理性、公平性、客观性吗?

目录 一、绩效考核流于形式:没有实际考核过 二、考核结果的确定: 主管一人说了算 三、考核结果: 与绩效奖金挂钩吗? 四、考核的滥用:成为公司排挤迫使员工离职的手段 五、公司说: 让你滚蛋,谁还会发你奖…

[HackMyVM]靶场Boxing

难度:Medium kali:192.168.56.104 靶机:192.168.56.143 端口扫描 ┌──(root㉿kali2)-[~/Desktop] └─# nmap 192.168.56.143 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-04-03 19:25 CST Nmap scan report for staging-env.boxing.hmv (192.168.56.143) Host …

智慧展览馆:基于AI智能识别技术的视频智慧监管解决方案

一、建设背景 随着科技的不断进步和社会安全需求的日益增长,展览馆作为展示文化、艺术和科技成果的重要场所,其安全监控系统的智能化升级已成为当务之急。为此,旭帆科技(TSINGSEE青犀)基于视频智能分析技术推出了展览馆…

路径规划——曲线拟合详解(一):多项式轨迹与QP优化(minimum-snap算法核心部分)

前言 历经一个多星期时间,我们在路径规划——搜索算法部分讲解了7种常见的路径搜索算法,每一种算法的链接放在下面了,有需要的朋友点击跳转即可: 路径规划——搜索算法详解(一):Dijkstra算法详…

redis之穿透、击穿、雪崩

目录 缓存雪崩 问题描述 缓存雪崩 问题描述 key 对应的数据存在,但在 redis 中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端数据库加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端数据库压垮。…

GPTfinger赋能指纹识别技术,德施曼赢下这一局

生成式AI这场战局里,德施曼跑赢同行,成为行业里第一个引入GPT技术的智能锁厂商。 4月2日,德施曼智能锁在北京举办了新品发布会之前的“创新技术预沟通会”,向到场媒体揭晓了最新技术突破之一——GPTfinger。 「智哪儿」认为&…

关闭PyCharm中因双击Shift而跳出的搜索框

有时候老是多次按到shift而跳出一个搜索框,本来在编写代码,怎么突然就开始搜索了,非常的烦人。 其实这个搜索框叫做“随处搜索”。 关闭步骤 1、打开PyCharm的设置。 2、在设置-高级设置中勾选-禁用双击修改键快捷键即可。

4.3学习总结

[HNCTF 2022 WEEK2]Canyource(无参数) 通过这题又接触了一种无参数RCE的方法,前面学习的getallheaders只有在apache环境下才能使用,具有一定的局限性 这里是利用php函数来构造读取flag的方法 localeconv() – 函数返回一个包含本…

Ribbon有哪些负载均衡策略

负载均衡类都实现了IRule接口。 RandomRule:随机的选用一个实例 RoundRobinRule:轮询的使用实例 RetryRule:在轮询的基础上加了一个错误重试机制,在deadline时间内会不断的重试 WeightResponeTimeRule:根据权重去做…

Golang 开发实战day07 - Functions

Golang 教程07 - Functions 1. Functions 1.1 什么是函数? 在 Golang 中,函数就像是代码的超级组合体,可以将一段代码封装成一个独立的单元,以便重复使用。 1.2 函数声明 func funcName(parameter1 type1, parameter2 type2)…

必看!香港Web3活动周跑会指南

星移斗转,又是一年嘉年华。 去年4月,在《虚拟资产发展政策宣言》的影响下,四散的华人Web3生态再度汇集,由万向区块链实验室、HashKey Group、W3ME联合举办的Hong Kong Web3 Festival 2023率先奏响了以香港为鼓点的加密奏曲&#x…

Celery的任务流

Celery的任务流 在之前调用任务的时候只是使用delay()和apply_async()方法。但是有时我们并不想简单的执行单个异步任务,比如说需要将某个异步任务的结果作为另一个异步任务的参数或者需要将多个异步任务并行执行,返回一组返回值,为了实现此…

个人医疗开支预测项目

注意:本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 ([www.aideeplearning.cn]) 项目背景 随着医疗成本的持续上涨,个人医疗开支成为一个重要议题。理解影响医疗费用的多种因素对于医疗保险公司、政府机构以及个人…

计算机组成结构1

概念 计算机组成: 运算器、控制器、存储器、输出设备、输入设备 CPU:运算器控制器 运算器:算数逻辑单元ALU、累加寄存器AC、数据缓冲寄存器DR、状态条件寄存器PSW 控制器:指令寄存器IR、程序计数器PC、地址寄存器AR、指令译码器I…

制作ubuntu镜像及烧录

最近更换了nuc主机作为机器人的控制主机,为了避免之前在操作系统过程中把系统搞崩了的惨状决定养成定期备份系统的好习惯,这就需要掌握制作系统镜像及烧录的能力。 1、安装systemback软件 ubuntu中可以使用systemback工具进行系统的备份,这…

人工智能、深度伪造和数字身份:企业网络安全的新前沿

深度伪造(Deepfakes)的出现打响了网络安全军备竞赛的发令枪。对其影响的偏执已经波及到一系列领域,包括政治错误信息、假新闻和社交媒体操纵。 深度伪造将加剧公共领域对信任和沟通的本已严峻的压力。这将理所当然地引起监管机构和政策制定者…

鸿蒙南向开发实战:【智能窗帘】

样例简介 智能窗帘设备不仅接收数字管家应用下发的指令来控制窗帘开启的时间,而且还可以加入到数字管家的日程管理中。通过日程可以设定窗帘开关的时间段,使其在特定的时间段内,窗帘自动打开或者关闭;通过日程管家还可以实现窗帘…

Intel TBB安装​​​​

下载 windows 版本,如: oneapi-tbb-2021.11.0-win.zip Releases oneapi-src/oneTBB (github.com)https://github.com/oneapi-src/oneTBB/releases 下载后解压,执行 env 文件夹下的 vars.bat 即可 Intel TBB,全称Intel Threading Building…

idea建多级目录出现问题,报错找不到xml文件,如何解决?

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&…

Python3.10 - 列表的常用方法

01 列表的切片 lst [a, b, 1, 2, [c1, 1]]# 01 列表的切片 lst1 lst[0:2] # 从0开始切到1(顾头不顾尾), 切得长度超过1时, 切出来为list类型 print(lst1, type(lst1))lst2 lst[0] # 从中切某个元素时, 切出来的类型即元素本身, 以下同理 print(lst2, type(lst2))lst3 ls…