前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >【SpringMVC】——Cookie和Session机制

【SpringMVC】——Cookie和Session机制

作者头像
三三是该溜子
发布2024-12-30 11:25:36
发布2024-12-30 11:25:36
9700
代码可运行
举报
文章被收录于专栏:该溜子的专栏该溜子的专栏
运行总次数:0
代码可运行

一:实践

1:获取URL中的参数

(1)@PathVariable

路径变量这个注解主要作⽤在请求URL路径上的数据绑定

默认传递参数写在URL上,SpringMVC就可以获取到

注意①请求路径中不能再{password}对应的地方写个字符串类型,尽管url是字符串类型,但是最后到服务器上转化为的是Integer类型

注意②下面这段代码中括号中的参数是连续赋值的这样一个过程

代码语言:javascript
代码运行次数:0
复制
@RequestMapping("m1/{password}/{name}")
    public String m1(@PathVariable("password") Integer id , @PathVariable("name") String name){
        return "id是:" + id +"    name是:" + name;
    }
29b35454261441359d9b03671c4f2577.png
29b35454261441359d9b03671c4f2577.png

2:上传文件

(1)普通写法
代码语言:javascript
代码运行次数:0
复制
@RequestMapping("m2")
    public String getfile(MultipartFile file){
        String fileName = file.getOriginalFilename();
        return "接受到的文件的名称为:" + fileName;
    }
af11837cb03a49b394c4d1a7b443db3f.png
af11837cb03a49b394c4d1a7b443db3f.png
(2)@RequestPart

@RequestPart这个注解可以作为中间商进行传参

代码语言:javascript
代码运行次数:0
复制
@RequestMapping("m2")
    public String getfile(@RequestPart("fileTemp") MultipartFile file){
        String fileName = file.getOriginalFilename();
        return "接受到的文件的名称为:" + fileName;
    }
(3)注意

上传的文件体积可能会过大,此时就要注意看日志了,往往错误的日志信息才是提升自己代码能力的关键

二:获取Cookie和Session

1:状态

理解状态和无状态:HTTP是一种无状态协议,什么是无状态呢?

无状态:在服务器和客户端的连接中,不保存对端信息。在下一次再连接时,需要再次验证身份。

有状态:类似第一次去医院,需要办理一张就诊卡,把身份信息登记一下,再看病。第二次再去医院的时候,直接刷卡,工作人员就知道你是谁了,不需要再走登记身份信息的流程了

实际开发中, 我们很多时候是需要知道请求之间的关联关系的

2:Cookie

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

此时在服务器这边就需要记录"令牌"信息, 以及令牌对应的⽤⼾信息, 这个就是 Session 机制所做的⼯作.

0d5afc7a768b46289f8230865974a888.png
0d5afc7a768b46289f8230865974a888.png
3cb8af2f10bc481ea2c851094125b93b.png
3cb8af2f10bc481ea2c851094125b93b.png

3:Session

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

Session是服务器为了保存⽤⼾信息⽽创建的⼀个特殊的对象

25985e57db92452cb05eddeedc705432.png
25985e57db92452cb05eddeedc705432.png

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

0cdb4f8d10994344af87cdfb8f8e07ed.png
0cdb4f8d10994344af87cdfb8f8e07ed.png
(1)模拟具体流程

①当⽤⼾登陆的时候, 服务器在 Session 中新增⼀个新记录, 并把 sessionId返回给客⼾端. (通过

HTTP 响应中的 Set-Cookie 字段返回).

②客⼾端后续再给服务器发送请求的时候, 需要在请求中带上 sessionId. (通过 HTTP 请求中的

Cookie 字段带上).

③服务器收到请求之后, 根据请求中的 sessionId在 Session 信息中获取到对应的⽤⼾信息, 再进⾏后续操作.找不到则重新创建Session, 并把SessionID返回

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

(2)易错点解释

4:两者区别

①Cookie 是客⼾端保存⽤⼾信息的⼀种机制. Session 是服务器端保存⽤⼾信息的⼀种机制

②Cookie 和 Session之间主要是通过 SessionId 关联起来的, SessionId 是 Cookie 和 Session 之间的桥梁

③Cookie 和 Session 经常会在⼀起配合使⽤. 但是不是必须配合.

④完全可以⽤ Cookie 来保存⼀些数据在客⼾端. 这些数据不⼀定是⽤⼾⾝份信息, 也不⼀定是

SessionId

⑤Session 中的sessionId 也不需要⾮得通过 Cookie/Set-Cookie 传递, ⽐如通过URL传递.

5:获取Cookie代码实现

(1)普通代码
代码语言:javascript
代码运行次数:0
复制
@RequestMapping("m3")
    public String m3(HttpServletRequest request , HttpServletResponse response){
        //获取Cookie信息
        Cookie[] cookies = request.getCookies();
        //打印Cookie信息
        StringBuilder builder = new StringBuilder();
        if(cookies != null){
            for(Cookie ck : cookies){
                builder.append(ck.getName() + ":" + ck.getValue());
            }
        }
        return "返回的Cookie信息是:" + builder;

    }
(2)lambda表达式
代码语言:javascript
代码运行次数:0
复制
 @RequestMapping("m3_5")
    public String m3_5(HttpServletRequest request , HttpServletResponse response){
        Cookie[] cookies = request.getCookies();
        if(cookies != null){
            Arrays.stream(cookies).forEach(ck-> System.out.println(ck.getName() + " " + ck.getValue()));
        }
        return "获取Cookie";
    }
(3)注解形式
代码语言:javascript
代码运行次数:0
复制
RequestMapping("m3.2")
    public String m3_2(@CookieValue("bite") String bite){
        return "bite:" + bite;
    }

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

HttpServletRequest , HttpServletResponse 是Servlet提供的两个类, 是Spring

MVC⽅法的内置对象. 需要时直接在⽅法中添加声明即可.

HttpServletRequest 对象代表客⼾端的请求, 当客⼾端通过HTTP协议访问服务器时,HTTP请

求头中的所有信息都封装在这个对象中,通过这个对象提供的⽅法,可以获得客⼾端请求的所有信

息.

HttpServletResponse 对象代表服务器的响应. HTTP响应的信息都在这个对象中, ⽐如向客⼾

端发送的数据, 响应头, 状态码等. 通过这个对象提供的⽅法, 可以获得服务器响应的所有内容

d8a5e98edf69480da075c014a5406c1b.png
d8a5e98edf69480da075c014a5406c1b.png
431649f2326d483eb455d8437874286c.png
431649f2326d483eb455d8437874286c.png

6:Cookie造假

7b37bd4bcfc240559ed4c8eafcbec18e.png
7b37bd4bcfc240559ed4c8eafcbec18e.png

从这个例⼦中, 也可以看出Cookie是可以伪造的, 也就是不安全的, 所以使⽤Cookie时, 后端需要进⾏Cookie校验

7:Session存储

(0)获取session

获取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 会话

代码语言:javascript
代码运行次数:0
复制
public String m4(HttpServletRequest request){
        HttpSession session = request.getSession();
        if(session != null){
            session.setAttribute("username","java");

        }
        return "session存储成功";
    }

简洁获取Session

①通过注解@SessionAttribute获取

先调用m6方法,获取session为null,在调用m4方法存储session,在调用m6

代码语言:javascript
代码运行次数:0
复制
@RequestMapping("m6")
    public String m6(@SessionAttribute(value = "username" , required = false) String username){
        return "m6方法中返回的username参数为:" + username;
    }
7a454392adc640a3872ad3d965f6bab7.png
7a454392adc640a3872ad3d965f6bab7.png

②通过Spring MVC内置对象HttpSession 来获取

代码语言:javascript
代码运行次数:0
复制
@RequestMapping("m7")
    public String m7(HttpSession session){
        String username = (String) session.getAttribute("username");
        return "m7方法中返回的username参数为:" + username;
    }
(1)第一次发送请求
(2)构架Session对象

可以看到, Http请求时, 把SessionId通过Cookie传递到了服务器

(3)第二次请求

8:Seesion读取

读取 Session 可以使⽤ HttpServletRequest

Object getAttribute(String name): 返回在该 session 会话中具有指定名称的对象,如果没有指定名

称的对象,则返回 null

代码语言:javascript
代码运行次数:0
复制
@RequestMapping("m5")
    public String m5(HttpServletRequest request){
        HttpSession session = request.getSession(false);
        String username = null;
        if(session != null && session.getAttribute("username") != null ){
            username = (String)session.getAttribute("username");

        }
        return "username:" + username;
    }

运行服务器,先用浏览器m5链接,再访问m4链接,最后再访问m5.可以看到下面这个有趣的现象

04ef4989874e41379139fca901e3d531.png
04ef4989874e41379139fca901e3d531.png
69a20fe26a4b44e9a8607e9cf4d97ff6.png
69a20fe26a4b44e9a8607e9cf4d97ff6.png
7a55e1b2c07e40718a572bd0fe32b355.png
7a55e1b2c07e40718a572bd0fe32b355.png

9:精华总结

客户端第一次发送请求给服务器的时候,会把自己的信息存储在请求中的Cookie字段中,服务器接收到请求后,进行解析,用session存下来Cookie中解析后的用户信息,然后把“令牌”保存在响应的set-Cookie字段中并返回给客户端,客户端接受到响应之后,下一次请求直接拿着“令牌”就可以了

(1)公共部分提取
(2)提取公共部分封装成HttpSession
(3)封装获取属性
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一:实践
    • 1:获取URL中的参数
      • (1)@PathVariable
    • 2:上传文件
      • (1)普通写法
      • (2)@RequestPart
      • (3)注意
  • 二:获取Cookie和Session
    • 1:状态
    • 2:Cookie
      • (1)模拟具体流程
    • 4:两者区别
    • 5:获取Cookie代码实现
      • (1)普通代码
      • (2)lambda表达式
      • (3)注解形式
    • 6:Cookie造假
    • 7:Session存储
      • (0)获取session
      • (1)第一次发送请求
      • (2)构架Session对象
      • (3)第二次请求
    • 8:Seesion读取
    • 9:精华总结
      • (1)公共部分提取
      • (2)提取公共部分封装成HttpSession
      • (3)封装获取属性
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档