在本篇中,我们利用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


shrio 获取session_服务器


我们点一下左上角地址栏左边的小感叹号,会发现:


shrio 获取session_客户端_02


这里有我们使用的一个cookie。点开看看:


shrio 获取session_shrio 获取session_03


这就是服务器传给前端(用户)的cookie。

再获取一下cookie试试。我们输入http://localhost:8080/getCookies


shrio 获取session_服务器_04


最后补充一点,除了刚才的从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


shrio 获取session_shrio 获取session_05


同样,我们打开感叹号来看一看:


shrio 获取session_shrio 获取session_06


会发现只有一个key为JSESSIONID的cookie

然后我们来获取一下看看:


shrio 获取session_shrio 获取session_07


最后,我们调用http://localhost:8080/logout登出一下看看:


shrio 获取session_shrio 获取session_08


再调用一下http://localhost:8080/getSession


shrio 获取session_客户端_09


因为session在服务器端已经被删除,所以显示不出任何信息了。

通过这样一个实践,是不是对于下面这张图的理解更加清晰了?


shrio 获取session_shrio 获取session_10


最后附我们的cookie-demo源代码:

cookie-demo