JavaWeb笔记(6)-会话技术中的Cookie与Session

Cookie

基本使用

Cookie是一种客户端的会话技术,它将数据保存在客户端中,以后的每次请求都会携带Cookie数据进行访问。Cookie可以看成是一个存储信息的集合,其中的信息以键值对形式存放,Cookie存放在浏览器端。对于Cookie的使用,我们主要需要关注的是获取Cookie,获取以及设置Cookie中的内容。

  • Cookie cookie = new Cookie("key", "value"):创建Cookie对象并设置数据
  • response.addCookie(cookie);:发送Cookie到客户端,需要使用response对象
  • Cookie[] cookies = request.getCookies();:获取客户端携带的所有Cookie,需要使用request对象
  • cookie.getName():获取cookie的key
  • cookie.getValue():获取cookie的value
  • cookie.setMaxAge(int seconds):设置cookie的过期时间,如果设置为0,则表示删除对应Cookie

在Cookie中是不能直接存储中文的,如果需要存储中文,则需要进行转码,将中文转码之后进行存储,需要使用的时候再进行转换得到中文结果。例如可以使用URLEncoder进行转码。

原理

Cookie的实现原理是基于Http协议的,其中会涉及到协议中两个请求头信息,响应头中的set-cookie以及请求头中的cookie。

浏览器第一次发送请求到服务器,服务器创建Cookie对象并进行数据设置,返回响应的时候,在响应头的set-cookie进行设置,表示添加的Cookie内容,浏览器接收到响应之后,就会将其中的内容保存到浏览器的Cookie中,后续继续发送请求的时候,会携带浏览器的Cookie,设置在请求头中的cookie字段,服务器通过获取Cookie,就可以维持用户的状态。

在浏览器中查看Cookie的方法:

第一种方法在浏览器的设置中查看,在Cookie和网站权限中可以查看所有站点的Cookies。

第二种方法是利用浏览器的控制台程序,选择Application,在其中的Storage模块中,可以查看当前网页存储的Cookies。

Session

基本使用

Session是一种服务端会话跟踪技术,它选择将数据保存在服务端。相比于Cookie来说,存储在服务端的数据更加安全。

在JavaEE中提供了HttpSession接口,用来实现一次会话的多次请求之间的数据共享功能,它的主要方法如下:

  • HttpSession session = request.getSession():获取Session对象,需要使用到request对象
  • void setAttribute(String name, Object o):将值存储到session域中
  • Object getAttribute(String name):根据key来获取值
  • void removeAttribute(String name):根据key,删除键值对
  • void invalidate():销毁该Session

原理

Session的底层也是基于Cookie实现的。在浏览器和服务器的一次会话中,使用的是同一个Session,而另一个会话使用的是另一个Session。在服务器第一次获取Session对象的时候,该对象会有一个唯一的标识id,在完成其他动作,返回响应的时候,在响应头中会添加一个set-cookie,其中设置的session的id,这样在浏览器端实际上保存了此次会话中对应的Session ID,后续的所有请求它都会带上这个Cookie,而服务器端也就能够知道这个会话应该使用哪个Session。

在服务器正常关闭和启动的过程中,Session中的数据是可以被保存下来的。在服务器正常关闭之后,Tomcat会自动将Session中的数据写入磁盘的文件中,再次启动服务器后,则会将对应的数据从文件进行加载。

在默认情况下,Session会有超时时间,30分钟后自动销毁,具体时间可以Tomcat配置文件中进行设置,当然我们也可以调用Session对象的invalidate方法进行销毁,在前面的操作中也有提到。

Cookie vs Session:Cookie 和 Session都能够用来完成一次会话中多次请求之间的数据共享,不过它们在许多方面都有所区别

  • 在存储位置上:Cookie将数据存储在客户端,Session则将数据存储在服务端
  • 在安全性上:Cookie不安全,Session安全
  • 在数据大小上:Cookie最大3kb,而Session无大小限制,但是一般也不应该设置得过大,影响服务器性能
  • 在服务器性能上:Cookie不会占用服务器资源,而Session会占用服务器资源

JavaWeb笔记(6)-会话技术中的Cookie与Session
http://example.com/2022/10/07/JavaWeb笔记-6-会话技术中的Cookie与Session/
作者
EverNorif
发布于
2022年10月7日
许可协议