在本篇中,我们利用SpringBoot框架来搭建服务,并使用javax.servlet包下的Cookie及HttpSession,来做一个简单实践。
如何搭建项目这里不再赘述,可以参考STEP4.1 第一个SpringBoot项目
Cookie
简单回顾一下使用cookie的流程:
客户端发送请求(此时请求体里没有cookie)
→ 服务器往请求的返回体中塞入cookie
→ 客户端收到cookie
→ 客户端继续发送请求(此时请求体里有cookie)
→ 服务器收到请求,解析处理cookie,处理请求,返回
→ 客户端继续发送请求(此时请求体里有cookie)
→ 服务器收到请求,解析处理cookie,处理请求,返回
→ ……
让我们创建一个CookieController类,为它注上@RestController注解,使它能够返回实体(数据)。
import
先为它添加一个设置Cookie的方法:
import
简单解释一下代码的含义:
用户可以通过/setCookies请求访问进这个方法,方法会创建一个键值对为("sessionId","CookieTestInfo")的cookie,并放进返回体中。最后和数据"get cookies successfully"一起返回给前端(或用户)。
之所以要把HttpServletResponse response写在方法参数中,是因为SpringBoot会帮助我们在接收到请求时自动初始化好一个返回体,不需要我们进行手动初始化,直接使用即可。
然后我们再来写一个获取cookies的方法:
package undestiny.cookiedemo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@RestController
public class CookieController {
@GetMapping("/setCookies")
public String setCookies(HttpServletResponse response){
//HttpServletRequest 装请求信息的类
//HttpServletResponse 装返回信息的类
Cookie cookie=new Cookie("sessionId","CookieTestInfo");
response.addCookie(cookie);
return "get cookies successfully";
}
//获取cookie中对应的key值
@GetMapping("/getCookies")
public String getCookies(HttpServletRequest request){
Cookie[] cookies = request.getCookies();
if(cookies != null){
for(Cookie cookie : cookies){
if(cookie.getName().equals("sessionId")){
return cookie.getValue();
}
}
}
return null;
}
}
这个代码逻辑很好理解。request接收请求体,把里面的cookies键值对都取出来,然后进行遍历。如果发现key为"sessionId"的cookie,就返回它的值。
最后我们来运行一下项目。
在浏览器中输入:http://localhost:8080/setCookies
我们点一下左上角地址栏左边的小感叹号,会发现:
这里有我们使用的一个cookie。点开看看:
这就是服务器传给前端(用户)的cookie。
再获取一下cookie试试。我们输入http://localhost:8080/getCookies
最后补充一点,除了刚才的从HttpServletResponse中获取cookies的方式, 我们还可以用注解方式来获取cookies:
//注解方式获取cookie中对应的key值
HttpSession
httpSession其实就是进一步封装了我们对Cookie的操作,帮助我们更简单地实现会话跟踪。
我们来看一下使用httpSession进行会话跟踪的流程:
客户端发送请求(此时请求体里没有cookie)
JSESSIONID的cookie
→ 客户端收到cookie
→ 客户端继续发送请求(此时请求体里有cookie)
→ 服务器收到请求,解析cookie,从内存中取出对应的会话信息确认身份,处理请求,返回
→ 客户端继续发送请求(此时请求体里有cookie)
→ 服务器收到请求,解析cookie,从内存中取出对应的会话信息确认身份,处理请求,返回
→ ……
→ 客户端请求登出
→ 服务器把内存里的会话信息删除
来看一下使用HttpSession来实现会话跟踪的简单代码:
import
这里用到了一个User实体,内含username和password属性,这里就不贴出了,可以参考文末的源码链接。
注意:HttpSession session不是从请求体里取出的。是请求体里取出了key为JSESSIONID的cookie,然后我们的框架自动帮我们从内存中找到了这个JSESSIONID对应的session,取出来给我们开发者。
session里面可以存储键值对,例如这一行代码:session.setAttribute("user",user);就是把一个键值对存到session里。
回顾一下我们STEP4.3 会话的内容,我们使用session时是把用户信息存在服务器本地,浏览器只维护一个key为JSESSIONID的cookie。我们来实践一下。
在浏览器中输入:http://localhost:8080/setSession
同样,我们打开感叹号来看一看:
会发现只有一个key为JSESSIONID的cookie
然后我们来获取一下看看:
最后,我们调用http://localhost:8080/logout登出一下看看:
再调用一下http://localhost:8080/getSession
因为session在服务器端已经被删除,所以显示不出任何信息了。
通过这样一个实践,是不是对于下面这张图的理解更加清晰了?
最后附我们的cookie-demo源代码:
cookie-demo