Cookie和Session简介。
Spring MVC的请求中
Cookie的设置和两种获取方式
Session的设置和三种获取方式。
三、(接上文)SpringMVC剩余基本操作
3.2postman请求
3.2.10 获取Cookie和Session
1.理解Cookie
我们知道HTTP协议自身是“无状态”协议。
"无状态" 的含义指的是:
默认情况下 HTTP 协议的客⼾端和服务器之间的这次通信和下次通信之间没有直接的联系.
实际开发中,我们很多时候需要知道请求之间的关联关系。
例如登陆网站成功后,第二次访问的时候服务器就能知道该请求是否是已经登陆过了.
当用户输入用户名和密码点击登录后,服务器响应,这时候登陆成功后,服务器会给用户一个“令牌”,这样下次用户再访问,就会带上“令牌”。服务器就知道这个用户已经登陆过了。
"令牌" 通常就存储在 Cookie 字段中.
此时在服务器这边就需要记录"令牌"信息,以及令牌对应的用户信息,这个就是 Session 机制所做的工作.
2.理解Session
此时在服务器这边就需要记录"令牌"信息,以及令牌对应的用户信息,这个就是 Session 机制所做的工作.
Session就是会话的意思,比如10个浏览器请求同一个服务器(同样的进程)。那么就会产生10个会话。这10个会话,服务器会通过Session来分辨出会话是哪个浏览器请求的。
服务器同⼀时刻收到的请求是很多的.服务器需要清楚的区分每个请求是从属于哪个用户,也就是属于哪个会话,就需要在服务器这边记录每个会话以及与用户的信息的对应关系. Session是服务器为了保存用户信息而创建的⼀个特殊的对象.
Session的本质就是⼀个 "哈希表",存储了⼀些键值对结构.Key就是SessionID,Value就是用户信息(用户信息可以根据需求灵活设计)。
SessionID就是由服务器生成的,“唯一性”字符。从Session机制角度看来,这个唯一性字符就是SessionID。如果站在登录流程中看待,也可以把这个唯一性字符称作“token”。
3.Cookie 和 Session之间的关系。(举例)
举一个生活中的例子,新生入学,学校会收录学生信息存储在教务系统,并为每一个学生设定学号
存储学生信息示例如下:
001 张三 18 计科1班
002 李四 19 计科1班
003 王五 18 计科1班
这里的信息就相当于Session
而学校存储信息之后,会给学生发学生证。
出入校园,使用学生证来证明学生身份。
这里的学生证就相当于Cookie
注意:
学生证(Cookie):是可以造假。
教务系统信息(Session):一定是真的
4.Cookie和session的区别
5.获取Cookie (两种方式)
①传统写法(可获取所有Cookie)
@RestController
@RequestMapping("/request")
public class RequestController {
/**
* 传统方法获取Cookie
* 每个方法都内置了HttpServletRequest request/HttpServletResponse response对象
* @param request
* @param response
* @return
*/
@RequestMapping("/getCookie")
public String getCookie(HttpServletRequest request, HttpServletResponse response){
Cookie[] cookies = request.getCookies();//通过这种方式可以获取Cookie
//我们使用lambda表达式的方式来打印Cookie。这种写法可以先了解一下。
// Arrays.stream(cookies).forEach(x->{
// System.out.println(x.getName() + ":" + x.getValue());
// });
//等价于使用foreach循环来打印Cookie
for (Cookie c: cookies){
System.out.println(c.getName()+":"+c.getValue());
}
return "获取Cookie成功!!!";
}
}
注意,如果Cookie为空,会报异常。因此写法如下。
@RequestMapping("/getCookie") public String getCookie(HttpServletRequest request, HttpServletResponse response){ Cookie[] cookies = request.getCookies();//通过这种方式可以获取Cookie //使用foreach循环来打印Cookie if(cookies != null){ for (Cookie c: cookies){ System.out.println(c.getName()+":"+c.getValue()); } return "获取Cookie成功!!!"; } return "Cookie为空!"; }
运行结果
当我们添加Cookie之后,刷新一下
Cookie也被打印在控制台上。从这里也可以看出,Cookie是可以造假,除了通过浏览器造假,通过Postman也是可以造假的。
②Spring Boot写法(@CookieValue注解获取指定Cookie)
我们使用postman添加几个Cookie,当我们使用传统方式打印Cookie
我们得到了所有的Cookie。但是当我们用SpringBoot方式打印。我们只能通过注解
@CookieValue来或者指定key值的cookie。
@RequestMapping("getCookie2")
public String getCookie2(@CookieValue("yang")String yang){
return "yang:"+yang;
}
因此使用这两种方法取决于你想要获取
全部Cookie还是
只获得某些Cookie
6.获取Session
①传统写法
@RequestMapping("setSession")
public String setSession(HttpServletRequest request){
HttpSession session = request.getSession();
session.setAttribute("student","zzx");
return "设置Session成功!";
}
@RequestMapping("getSession")
public String getSession(HttpServletRequest request){
HttpSession session = request.getSession();
//默认值为ture,如果Session为null,就创建一个空的Session
String student = (String) session.getAttribute("student");
return "登录用户:"+student;
}
http://127.0.0.1:1208/request/setSession
http://127.0.0.1:1208/request/getSession
②SpringBoot写法()
I.直接使用内置对象HttpSession session获取Session。
@RequestMapping("getSession2")
public String getSession(HttpSession session){
String student = (String) session.getAttribute("student");
return "登录用户:"+student;
}
II.使用注解 (@SessionAttribute)
@RequestMapping("getSession3")
public String getSession(@SessionAttribute("student")String student){
return "登录用户:"+student;
}
虽然这样写如下代码非常的简短,但是也有一个问题就是如果直接getSession。会报错
没有找到student这个类型。这是因为加了注解之后,这个参数就变成了必传参数,因此不能为空。
如何修改呢,如下: @SessionAttribute(value = "student",required = false)
@RequestMapping("getSession3")
public String getSession(@SessionAttribute(value = "student",required = false)String student){
return "登录用户:"+student;
}
此时就不报错了。
3. 3响应:
我们可以
使用Fiddler来查看请求和响应的数据
执⾏了业务逻辑之后,要把程序执⾏的结果返回给⽤⼾,也就是响应.
对于SpringMVC来说,掌握了以上3个功能就相当于掌握了SpringMVC.
SpringBoot和SpringMVC有什么区别?
SpringBoot是创建SpringMVC的一种方式。anan
明天继续更