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的keycookie.getValue()
:获取cookie的valuecookie.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会占用服务器资源