【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)封装获取属性

相关推荐
启山智软10 分钟前
【中大企业选择源码部署商城系统】
java·spring·商城开发
我真的是大笨蛋13 分钟前
深度解析InnoDB如何保障Buffer与磁盘数据一致性
java·数据库·sql·mysql·性能优化
怪兽源码41 分钟前
基于SpringBoot的选课调查系统
java·spring boot·后端·选课调查系统
恒悦sunsite1 小时前
Redis之配置只读账号
java·redis·bootstrap
梦里小白龙1 小时前
java 通过Minio上传文件
java·开发语言
人道领域1 小时前
javaWeb从入门到进阶(SpringBoot事务管理及AOP)
java·数据库·mysql
csdn_aspnet1 小时前
ASP.NET Core 中的依赖注入
后端·asp.net·di·.net core
sheji52611 小时前
JSP基于信息安全的读书网站79f9s--程序+源码+数据库+调试部署+开发环境
java·开发语言·数据库·算法
毕设源码-邱学长1 小时前
【开题答辩全过程】以 基于Java Web的电子商务网站的用户行为分析与个性化推荐系统为例,包含答辩的问题和答案
java·开发语言
摇滚侠2 小时前
Java项目教程《尚庭公寓》java项目从开发到部署,技术储备,MybatisPlus、MybatisX
java·开发语言