1. 简述什么是会话技术?
答:会话是由一组请求与响应组成,是围绕着一件相关事情所进行的请求与响应。所以这些请求与响应之间一定是需要有数据传递的,即是需要进行会话状态的跟踪。然而,HTTP协议是一种无状态协议,在不同的请求间是无法进行数据传递的,此时就需要一种可以进行请求间数据传递的会话跟踪技术。----这就是会话技术(所谓的会话过程就是指从打开浏览器到关闭浏览器的过程。)
2. 什么是Cookie技术?
Cookie是由服务器生成,保存在客户端的一种信息的载体。这个载体中存放着用户访问该站点的会话状态信息。只要Cookie没有被清空,或者Cookie没有失效,那么,保存在其中的会话状态就有效。
浏览器(客户端)中的Cookie:
cookie的工作原理:
1.用户提交第一次请求后,由服务器生成Cookie,并将其封装到响应头中,以响应头的形式发给客户端。
2.客户端接收到这个响应后,将Cookie保存到本地客户端(保存到硬盘中,而不是缓存)。
3.当客户端再次发送同类请求的时候,在请求中会携带保存在客户端的Cookie数据,发送到客户端,由服务器对会话进行跟踪。
4.Cookie技术不是JavaWeb开发专有技术,而是数据Web开发的技术,是所有Web开发语言均支持的技术。
5.Cookie由若干键值对构成,这里的键一般称为name,值为value。Cookie中的键值对均为字符串
同类请求:指的是资源路径相同,资源名称不同。(如:localhost:8080/login和localhost:8080/captche)
总结:cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上cookie,这样服务器就能通过cookie的内容来判断这个是“谁”了。
cookie的具体使用:
https://blog.csdn.net/qq_29132907/article/details/80390792
域属性空间范围对比
https://blog.csdn.net/qq_42764468/article/details/101942826
3. 什么是Session技术?
和Cookie一样是Web开发中的一种会话状态跟踪技术,不同的是Cookie是将会话状态保存在了客户端,而Session则是将会话状态保存在了服务端。在JavaWeb开发中,Session是以javax.servlet.http.HttpSession的接口对象的形式出现的。
servlet 容器使用此接口创建 HTTP 客户端和 HTTP 服务器之间的会话。会话将保留指定的时间段,跨多个连接或来自用户的页面请求。一个会话通常对应于一个用户,该用户可能多次访问一个站点。
(1) Session对象的创建
HttpSession session = req.getSession(); //Session对象的创建
session.setAttribute("code",code); //向Session放入指定的名称“code”、指定值code
若要对Session进行操作,则可以通过HttpServletRequest的getSession()方法获取。该方法具有两个重载的属性:
-
public HttpSession getSession(boolean create)
该方法用于创建Session。若参数create为true,则表示当前没有Session,则新建一个Session,若当前存在Session,则用当前的Session。若参数creat为false表示若当前没有Session,则直接返回null;
- public HttpSession getSess
该方法创建Session。相当于getSession(true),即没有Session则创建新的Session。
- 何时使用getSession(ture),即getSession(),何时使用getSession(false)呢?
getSession(ture),即getSession():向Session中存放数据。解释:当前没有Session,则新建一个Session,若当前存在Session,则用当前的Session,因为存放数据必须要有Session的。
getSession(false):从session中获取数据。解释:若当前存在Session,则从中获取数据;若当前没有Session,那就不可能存在Session数据了。无需创建一个新的Session,在从新的Session中获取数据,因为新创建的Session中是不可能有数据的。
(2) 对Session域属性空间的操作
Session是一个专门存放数据的集合。我们一般称这个用于存放数据的内存空间为域属性空间,简称域。HttpSession中具有三个方法,是专门用于对该域属性空间中的数据进行读、写操作的。
- 该方法用于向Session的域属性空间中放入指定的名称、指定值的域属性。
public void setAttribute(String name, Object value);
- 该方法用于从Session的域属性空间中读取指定名称为域属性值。
public Object getAttribute(String name);
String saveCode = (String)req.getSession().getAttribute("code");//强制类型转换,读取指定名称为域属性值
- 该方法用于从Session的域属性空间中删除指定名称的域属性。
public void removeAttribute(String name);
(2) Session的工作原理
- 写入Session列表
服务器对当前应用中的Session是以Map的形式进行管理的,这个Map称为Session列表。该Map的key为一个32位长度的随机串,这个随机串称为JSessionID,Value则为Session对象的引用。
当用户第一次提交请求时,服务端Servlet中执行request.getSession()方法后,会自动生成一个Map.Entry对象,key为一个根据某种算法新新生成的JSessionID,value则为新创建的HTTPSession对象。
- 服务器生成并发送Cookie
在将Session信息写入Session列表后,系统还会将“JSessionID”作为name,这个32位长度的随机字符串作为value,以Cookie的形式放到响应报头中,并随着响应,将Cookie发送到客户端。
- 客户端接收并发送Cookie
客户端接收到这个Cookie后会将其存放到浏览器的缓存中。即,只要客户浏览器不关闭,浏览器中的Cookie就不会消失。
当用户提交第二次请求的时候,会将缓存中的这个Cookie,伴随着请求的头部信息,一块发送到服务端。
- 从Session列表中查找
服务端从请求中读取到客户端发送来的Cookie,并根据Cookie的JSessionID的值,从Map中查找相应Key所对应的value,即Session对象。然后,对该对象的域属性进行读写操作。
(3) Session的时效
若某个Session在指定时间范围内一直未被访问,那么Session将超时,即失效。
在web.xml中可以通过<session-config/>标签设置Session的超时时间,单位为分钟。默认超时时间是30分钟。
<!--filter.listener,servlet,and servlet-mapping等元素要在session-config之前-->
<session-config>
<session-timeout>15 </session-timeout>
</session-config>