目录
1. Cookie与Session基础知识
1.1 Cookie与Session的区别
2. 使用servlet原生方法获取Cookie
2.2 关于λ表达式遍历法的空指针问题
2.3 Cookie的伪造
3. 使用Spring注解获取Cookie
3.1 获取单个Cookie
3.2 获取多个Cookie
1. Cookie与Session基础知识
在本专栏HTTP请求与响应部分已经提到过关于报头Cookie的基本知识,原文链接如下:
【JavaEE】_HTTP请求报头header-CSDN博客https://blog.csdn.net/m0_63299495/article/details/136140202此处仅作以简单概括:
1. HTTP是无状态的,即没有记忆功能。
无状态的含义是:默认情况下HTTP协议的客户端和服务器之间的这次通信和下次通信之间没有直接的联系。
无论请求的时机如何,只要请求的参数相同,其处理的逻辑是一样的(不是数据一样),得到的结果也是一样的。
2. 但在实际开发中,有时需要明确请求与请求之间的联系,比如登录过后,第二次登录时服务器就知道该客户端是否已经登录过了;
Cookie与Session就是用于实现部分内容的记忆。
1.1 Cookie与Session的区别
(1)Cookie是客户端保存用户信息的一种机制,Session是服务器保存用户信息的一种机制;
(2)Cookie和Session之间主要是通过SessionId关联起来的,SessionId是Cookie和Session之间的桥梁;
(3)Cookie和Session经常会在一起配合使用,但并不是必须配合:
① 完全可以用Cookie来保存一些数据在客户端,这些数据不一定是用户身份信息,也不一定是SessionId;
② Session中的sessionId也不需要非得通过Cookie / Set-Cookie传递,比如通过URL传递;
2. 使用servlet原生方法获取Cookie
package com.example.demo.controller;import com.example.demo.Person;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;@RequestMapping("/Para")
@RestController
public class ParaController {@RequestMapping("/getCookie")public String getCookie(HttpServletRequest request, HttpServletResponse response){Cookie[] cookies = request.getCookies(); //获取Cookie对象for (Cookie cookie : cookies) {System.out.println(cookie.getName()+": "+cookie.getValue());}}
}
注:HttpServletRequest和HttpServletResponse在Servlet部分也曾使用过,Spring是基于Servlet实现的。
HttpServletRequest和HttpServletResponse是Spring的内置对象,需要使用时加上声明即可;
2.2 关于λ表达式遍历法的空指针问题
对于遍历Cookies逐个获取到cookie对象时,可以使用λ表达式:
@RequestMapping("getCookie")public String getCookie(HttpServletRequest request, HttpServletResponse response){Arrays.stream(cookies).forEach(cookie->{System.out.println(cookie.getName()+": "+cookie.getValue());});return "Cookies accepted successfully";}
现使用浏览器构造HTTP请求访问:
可见错误码500,表示服务器内部错误;
查看服务器日志:
对应修改75行代码消除空指针异常:
@RequestMapping("/getCookie")public String getCookie(HttpServletRequest request, HttpServletResponse response){Cookie[] cookies = request.getCookies(); //获取Cookie对象if(cookies != null){Arrays.stream(cookies).forEach(cookie->{System.out.println(cookie.getName()+": "+cookie.getValue());});}return "Cookies accepted successfully";}
此时再重新启动,使用浏览器访问:
可见此时服务器接收cookie成功,只是由于当前cookie为空,故而没有显示cookie内容;
2.3 Cookie的伪造
在Chrome页面按F12调出控制台,进行如下操作:
此时刷新浏览器页面,回到服务器端查看服务器日志:
3. 使用Spring注解获取Cookie
1. 使用Spring获取Cookie需要使用注解@CookieValue;
2. 注意Cookie是客户端保存信息的机制,与浏览器有关。
重启服务器后,在上例中设置的cookie仍然存在;
3.1 获取单个Cookie
.java文件内容如下:
package com.example.demo.controller;import com.example.demo.Person;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;@RequestMapping("/Para")
@RestController
public class ParaController {@RequestMapping("/getCookie2")public String getCookie(@CookieValue String aaa){return "CookieName: aaa "+"CookieValue: "+ aaa;}
}
重新启动服务器,根据URL访问,客户端页面如下:
可见Cookie获取成功;
3.2 获取多个Cookie
.java文件内方法修改如下:
@RequestMapping("/getCookie2")public String getCookie(@CookieValue String aaa, @CookieValue String bbbb){return "CookieName: aaa "+"CookieValue: "+ aaa+"\n"+"CookieName: bbbb "+"CookieValue: "+ bbbb;}
重新启动运行并刷新浏览器:
注意在使用Servlet原生方法获取cookie时,获取到的是所有的cookie;
而使用spring注解@CookieValue获取cookie,只能逐个获取cookie;