【SpringMVC】——Cookie和Session机制

阿华代码,不是逆风,就是我疯

你们的点赞收藏是我前进最大的动力!!

希望本文内容能够帮助到你!!

目录

一:实践

1:获取URL中的参数

(1)@PathVariable

2:上传文件

(1)普通写法

(2)@RequestPart

(3)注意

二:获取Cookie和Session

1:状态

2:Cookie

[​编辑 3:Session](#编辑 3:Session)

4:两者区别

5:获取Cookie代码实现

(1)普通代码

(2)lambda表达式

(3)注解形式

6:Cookie造假

7:Session存储

(0)获取session

(1)第一次发送请求

(2)构架Session对象

(3)第二次请求

8:Seesion读取

9:精华总结

(1)公共部分提取

(2)提取公共部分封装成HttpSession

(3)封装获取属性

一:实践

1:获取URL中的参数

(1)@PathVariable

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

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

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

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

java 复制代码
@RequestMapping("m1/{password}/{name}")
    public String m1(@PathVariable("password") Integer id , @PathVariable("name") String name){
        return "id是:" + id +"    name是:" + name;
    }

2:上传文件

(1)普通写法

java 复制代码
@RequestMapping("m2")
    public String getfile(MultipartFile file){
        String fileName = file.getOriginalFilename();
        return "接受到的文件的名称为:" + fileName;
    }

(2)@RequestPart

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

java 复制代码
@RequestMapping("m2")
    public String getfile(@RequestPart("fileTemp") MultipartFile file){
        String fileName = file.getOriginalFilename();
        return "接受到的文件的名称为:" + fileName;
    }

(3)注意

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

二:获取Cookie和Session

1:状态

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

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

有状态:类似第一次去医院,需要办理一张就诊卡,把身份信息登记一下,再看病。第二次再去医院的时候,直接刷卡,工作人员就知道你是谁了,不需要再走登记身份信息的流程了
实际开发中, 我们很多时候是需要知道请求之间的关联关系的

2:Cookie

下述图中的 "令牌" 通常就存储在 Cookie 字段中
此时在服务器这边就需要记录"令牌"信息, 以及令牌对应的⽤⼾信息, 这个就是 Session 机制所做的⼯作.

3:Session

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

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

(1)模拟具体流程
①当⽤⼾登陆的时候, 服务器在 Session 中新增⼀个新记录, 并把 sessionId返回给客⼾端. (通过
HTTP 响应中的 Set-Cookie 字段返回).
②客⼾端后续再给服务器发送请求的时候, 需要在请求中带上 sessionId. (通过 HTTP 请求中的
Cookie 字段带上).
③服务器收到请求之后, 根据请求中的 sessionId在 Session 信息中获取到对应的⽤⼾信息, 再进⾏后续操作.找不到则重新创建Session, 并把SessionID返回
Session 默认是保存在内存中的. 如果重启服务器则 Session 数据就会丢失

4:两者区别

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

5:获取Cookie代码实现

(1)普通代码

java 复制代码
@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表达式

java 复制代码
 @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)注解形式

java 复制代码
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响应的信息都在这个对象中, ⽐如向客⼾
端发送的数据, 响应头, 状态码等. 通过这个对象提供的⽅法, 可以获得服务器响应的所有内容

6:Cookie造假


从这个例⼦中, 也可以看出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 会话

java 复制代码
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

java 复制代码
@RequestMapping("m6")
    public String m6(@SessionAttribute(value = "username" , required = false) String username){
        return "m6方法中返回的username参数为:" + username;
    }

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

java 复制代码
@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

java 复制代码
@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.可以看到下面这个有趣的现象

9:精华总结

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

(1)公共部分提取

(2)提取公共部分封装成HttpSession

(3)封装获取属性

相关推荐
长栎16 分钟前
写 for 循环写了十年,你却从没用过迭代器模式最狠的那一面
后端
LiaCode20 分钟前
Redis 在生产项目的使用
前端·后端
用户5598224812224 分钟前
Docker Compose Down 导致容器数据误删——ext4 日志恢复全记录
后端
LiaCode25 分钟前
一天学完 redis 的爽翻版核心知识总结
前端·后端
大刚测试开发实战26 分钟前
如何内网穿透访问本地私有化部署的TestHub
前端·后端·github
xiaodaoluanzha1 小时前
迄今為止,最簡單的編程語言 Nolang
前端·后端
Csvn1 小时前
Docker 容器管理入门 — 从镜像到容器编排
后端
用户762352425911 小时前
ShardingJDBC
后端
行者全栈架构师1 小时前
IDEA 中 Maven 项目的 15 个红色报错快速解决方法
java·后端
令人头秃的代码0_01 小时前
mac(m5)平台编译openjdk
java