Session和Cookie出现的原因:
由于Http是无状态的协议,会话之间没有任何关联,也就是上一次会话和下一次会话没有任何关联,因此出现了会话技术Cookie和Session
下面分别从Cookie和Session两方面来讨论:
Cookie:
Cookie是客户端的会话技术,当浏览器访问服务端时,服务端可以通过将Cookie信息存放到响应头Set-Cookie字段中,随着响应报文发送给浏览器
浏览器看到Set-Cookie字段后,会将该信息保存起来,下次请求时,将Cookie自动放到请求头的Cookie字段发送给服务器端,服务端解析Cookie信息可以
获得相关的信息,例如保存登录状态等等
以Java为例:
浏览器访问服务端的接口
/** * Cookie测试 * @param httpServletResponse * @return */ @GetMapping("/testCookie") public Result testCookie(HttpServletResponse httpServletResponse){ //如何创建Cookie Cookie cookie = new Cookie("test","xxxxx"); //如何将Cookie返回给客户端--通过Response响应给浏览器 httpServletResponse.addCookie(cookie); return Result.success("success"); }
服务端响应给浏览器的信息如图:
下次浏览器再次与服务端通信的时候,会将次Cookie存放在请求头的Cookie字段,一起发送给服务端,如图
Cookie的相关参数
Cookie由于以文本形式保存到浏览器,因此不太安全,而且每个浏览器存放Cookie的数量和大小都有区别,因此出现了下面的服务端会话技术Session
Session:
Session存储在服务端,客户端只存储了SessionId,服务端将一次会话的重要信息存放在Session中,浏览器只记录SessionId,一个SessionId对象一次会话请求
同样的,服务端设置完Session之后,Session会随着响应一起发送给客户端,Session通过响应头中的Set-Cookie字段,数据格式以JSessionId=xxx
的方式来返回给浏览器
下面以Java代码为例:
/** * Session测试 * @param httpServletRequest * @return */ @GetMapping("/testSession") public Result testSession(HttpServletRequest httpServletRequest){ //如何创建Session HttpSession session = httpServletRequest.getSession(); session.setAttribute("testSession",222222); //如何将Session返回给客户端--设置完Sesison的key-value后,服务端会生成SesisonId来记录本次会话信息,通过Response响应给浏览器 return Result.success("success"); }
服务端响应头中Set-Cookie字段来传递Session,生成一个唯一Id来记录本次会话
下次会话时,浏览器将自动将SessionId携带至请求头的Cookie字段来一起请求服务端,如图
Session即使我关闭浏览器,再次打开浏览器请求该站点时,值要Session没过期(默认30分钟),也会将该Session自动携带至请求头给服务端