系列文章目录
第一章 初识Spring MVC
文章目录
- 系列文章目录
- 前言
- 一、Cookie和Session
- 二、Cookie操作
- 获取Cookie
- 指定Cookie
- 三、Session操作
- 设置Session数据
- 获取Session数据
- 四、获取Header
- 总结
前言
HTTP是"无状态"的协议,我们可以理解为它没有记忆力。无论来了多少次,他都会从头到尾重新执行。但是我们希望它能够在特定的情况下存在“记忆”,以账号密码为例,我们希望进入网站时存储着以前使用过的账号密码。这就需要借助Cookie和Session的帮助了。
一、Cookie和Session
**Cookie存在客户端中。Session存放在服务器中。 **
以CSDN为例,当我们进入CSDN后需要登录才能进行更多操作,在之后的一段时间里,我们都不需要重新进行登录操作,CSDN也能够直接获取到我们的信息。
- 登录后服务器创建Session存储信息,并通过set-Cookie 将SessionID 存放在Cookie中。
- 在客户端后续再给服务器发送请求时,都需要在请求中带上SessionId
- 服务器收到请求后,将请求中的SessionId在对应的Session中获取到对应的信息,再进行后续操作。
- 如果找不到对应的Session 就会重新创建Session 并把SessionID返回。
二、Cookie操作
在客户端中,Cookie是可以伪造的,我们可以通过开发者模式设置Cookie。在下文中都会通过伪造Cookie的方式作为数据。
获取Cookie
我们可以通过代码操作获取到Cookie,SessionID也只是Cookie中的一部分。
在下面的代码中,HttpServletRequest 操作中都有对Cookie的相关设置包括获取和添入。
@RequestMapping("/getCookie")
public String getCookies(HttpServletRequest request) {
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for(Cookie cookie : cookies) {
System.out.println(cookie.getName() + ":
"+cookie.getValue());
}
}
return "获取Cookie成功";
}
Cookie中的数据有效时间大概是半小时左右,我们也可以对它进行设置。因此即使我们重新运行程序,Cookie在短时间内也不会消失。而运行这段代码的结果如下图所示
指定Cookie
在上面我们获取Cookie是获取全部的Cookie,我们也可以使用Spring的注解 @CookieValue 指定获取Cookie中的指定数据
在http://127.0.0.1:8080/中我们伪造Cookie三个数据,接下来我们通过代码获取指定的数据name,通过注解指定的name赋值到方法参数中。
@RequestMapping("/getCookie2")
public String getCookie2(@CookieValue("name") String name) {
System.out.println("获取到Cookie:" + name);
return "获取Cookie成功";
}
三、Session操作
与Cookie一样,我们也可以通过代码去获取Session和设置Session中的数据。
在HttpServletRequest类中不只有getCookie,同时也有对应的Session方法。
设置Session数据
Session是服务器中的数据,是无法像Cookie那样在客户端伪造的。因此提供了setAttribute方法设置Session中的数据。
在下面的代码中,首先调用了getSession方法,旨在查看该网站中是否原本就存在Session 如果存在,就继续在原Session下进行数据管理;如果不存在Session,就创建Session.
设置参数值为true即当不存在Session时,创建一个新的Session
@RequestMapping("/setSession")
public String setSession(HttpServletRequest request) {
HttpSession session = request.getSession(true);
session.setAttribute("name","zhangsan");
session.setAttribute("age","111");
return "设置Session成功";
}
代码运行结果如下,在运行代码之后,我们可以看到除了原先伪造的Cookie,还多了一个“JSESSIONID” 里面存储的就是SessionID等关于Session的数据。
获取Session数据
在获取Session数据中,同样的我们可以使用HttpServletRequest提供的getAttribute方法获取数据
@RequestMapping("/getSession")
public String getSession(HttpServletRequest request) {
//如果参数为false 不存在session时返回null
HttpSession session = request.getSession(false);
if (session != null) {
System.out.println(session.getAttribute("name"));
System.out.println(session.getAttribute("age"));
}
return "成功获取Session";
}
代码结果如下
为了方便,Java又提供了一个类HttpSession对session进行操作。与HttpServelet类相比,它不需要进行参数值设置,当session为null时就会自动创建出一个新的Session
同时带有一个注解@SessionAttribute 设置required为false时为非必填项。
我们可以通过这个注解获取指定的参数数据。
@RequestMapping("/getSession3")
public String getSession3(@SessionAttribute(value = "name",required =
false) String name) {
System.out.println("name:" + name);
return "成功获取Session";
}
四、获取Header
与前两个一样,使用的还是HttpServletRequest类中的getHeader方法
在下面的代码中我们获取Header中的User-Agent数据
@RequestMapping("/getHeader")
public String getHeader(HttpServletRequest request) {
String userAgent = request.getHeader("User-Agent");
return "userAgent: " + userAgent;
}
运行结果如下图
同样的可以指定元素进行赋值
@RequestMapping("/getHeader2")
public String getHeader2(@RequestHeader("USer-Agent") String
userAgent) {
return "userAgent:" + userAgent;
}
总结
Cookie和Session是网站开发中一个关键的节点,连通服务器和客户端之间的桥梁。
本文通过HttpServletRequest类对Cookie、Session、Header进行设置以及获取操作。
同时,在注解方面,@CookieValue、@SessionAttribute、@RequestHeader注解都能够获取指定属性的数据。
源码可见Cookie和Session