会话管理(会话处理+会话数据保存)
什么是会话
从打开浏览器访问服务器开始,到访问服务器结束关闭浏览器为止,这期间产生的多次请求和响应加在一起就称之为是浏览器和服务器之间的一次会话。
会话中请求的处理:Servlet技术
作用:
会话过程中处理请求(接收+响应)
工作原理:
客户端发送请求给服务端,服务端将请求信息发送给Web容器中的Servlet,Servlet处理好请求后,将处理结果发送给服务端,服务端将请求响应给客户端
本质:
java代码程序
运行环境:
必须依赖于Web容器无法独立运行
开发思路:
新建一个Dynamic Web Project项目,指定运行环境,在该项目中新建Servlet程序,指定web项目版本
指定该Servlet继承父类(一般是HTTPServlet)后就算是将该Servlet发布到Web容器中了
在web.xml中配置访问的目标Servlet以及访问的路径名
调用过程:
//同时也解答了 “在浏览器中输入URL后底层有什么变化”
1.发送:
- 在浏览器中输入URL后,按照协议格式发送HTTP请求
2.解析:
服务器解析HTTP请求:访问的是哪一个主机上的哪个应用上的哪个资源
- 服务器根据请求中的Host头,获取浏览器想要访问的目标虚拟主机
- 服务器根据请求行中的资源路径,获取浏览器想要访问的是这一台虚拟主机上的哪一个Web应用中的哪一个资源
- 服务器根据获取到的目标访问资源路径,去web.xml文件中匹配访问的真实路径
3.处理请求:
- 服务器根据获取到的真实路径,封装好请求对象request后,调用对应的Servlet实例(此时response对象为空),在Servlet中处理好请求后,将响应数据封装到response对象中,发送给服务器
4.响应:
- 服务器接收到响应对象之后,将数据按照HTTP协议的格式组织成响应信息,发送给浏览器
注意:
- 请求和响应信息本质上都是字符串,浏览器只能解析字符串
- Servlet创建一次后就会驻留在服务器中等待处理其他请求
Servlet的生命周期:
- 创建:Servlet在第一次被访问的时候创建
- 初始化:服务器会调用Servlet的init方法实现初始化
- 处理请求:接收请求后处理请求
- 驻留等待:响应后驻留在服务器中等待第二个请求到达
- 死亡:服务器关闭时会先调用destory销毁Servlet对象 / web引用移出web容器时会销毁Servlet对象
Servlet资源跳转方式:转发和重定向和定时刷新
转发:
工作过程:
- 浏览器发送请求访问AServlet
- 服务器接收到请求后将请求转发给BServlet处理
- BServlet处理请求后响应
特点:
- 地址不变:转发前后地址栏不变
- 内部跳转:发生在服务器内部中
- 同一应用:转发前后两个资源同属于一个Web应用中,否则无法实现转发
- 一次请求:无论多少次转发,外部只有一次请求(内部跳转)
实现:
- request.getRequestDispatcher("目标资源在WEB-Content中的路径").forward(request, response);
重定向
工作过程:
- 浏览器请求AServlet
- AServlet响应302状态码,并将location响应头设置为BServlet的路径
- 浏览器接收到AServlet的响应后根据302和location,将请求发送给BServlet
- BServlet对请求作出响应
特点:
- 地址改变:浏览器地址发生变化
- 外部跳转:是一个浏览器->服务器->浏览器->服务器的过程,以浏览器作为请求的中转
- 多次请求多次响应:
- 立即跳转
- 跨Web应用:可以是不同Web应用,不同虚拟主机
实现:
- response.sendRedirect("重定向到资源的完整路径");
定时刷新:
主要作用:
- 提示几秒后刷刷新到其他页面
实现:
- Response.setHeader("Refresh","几秒后刷新,刷新到哪个URL")
特点:
- 间隔一定时间后再跳转 跳转前可以输出内容到浏览器提示用户
-------------------------------------------------------手动分隔线---------------------------------------------------------------------------------------------------------------
会话中数据保存和共享:Cookie+Session
Cookie:客户端技术
Cookie的工作原理:
通过set-Cookie响应头和Cookie请求头将会话过程中产生的数据保存在客户端中
Cookie的工作过程://重定向
服务端通过set-Cookie响应头将数据保存在浏览器中的Cookie中,以便再次利用
1.浏览器发起请求BuyServlet,将要保存的数据发送给服务器
2.BuyServlet接收到请求,同时也就接收到了要保存的数据,通过set-Cookie响应头保存这些数据,之后将这些数据响应给浏览器
3.浏览器接收到Set-Cookie响应信息后,将响应头的数据保存在浏览器中的Cookie中
4.浏览器需要再发一下相同的请求信息给服务器的时候就可以利用浏览器中Cookie内的数据
Cookie API操作 :
创建:
- Cookie cookie = new Cookie(String name,String value);
添加:
- response.addCookie(Cookie cookie)
- 将指定的Cookie对象添加到响应中,最后随响应发送给浏览器保存(底层还是通过set-Cookie响应头将Cookie值发送给浏览器)
获取:
- request.getCookies()
- 返回请求中所有的Cookie对象组成的数组,如果请求中没有任何Cookie信息,该方法将会返回null。
生存时间:s单位
- cookie.setMaxAge(60*60*24*365)
- 不设置生存时间:保存在浏览器中的内存中
- 设置生存时间:Cookie会以文件形式保存在浏览器的临时文件夹中,即使浏览器关闭内存释放,目标Cookie在磁盘中仍然会保存,浏览器开启的时候仍然可以获取到。
删除:
- cookie.setMaxAge(0)
Session:服务端技术
作用:
- 在一整个会话范围内共享数据
工作原理:
- 将会话中产生的数据保存在服务器中
工作过程://重定向//有Cookie
1.客户端发起请求BuyServlet,将要保存在服务器中的数据发送给服务器
2.服务器接收到数据后,创建Session去保存这些数据,并给该Session分配全局唯一ID
3.服务器将该SessionID通过Set-Cookie响应头,响应到浏览器中的Cookie中
4.浏览器再一次发起相同请求的时候,会将SessionID作为请求数据发送给服务器
5.服务器会去获取目标Session中的数据,处理后响应给浏览器
2.服务器接收到数据后,创建Session去保存这些数据,并给该Session分配全局唯一ID
3.服务器将该SessionID通过Set-Cookie响应头,响应到浏览器中的Cookie中
4.浏览器再一次发起相同请求的时候,会将SessionID作为请求数据发送给服务器
5.服务器会去获取目标Session中的数据,处理后响应给浏览器
工作过程://无Cookie
1.浏览器第一次发送请求需要保存数据时,服务端获取到需要保存的数据,去服务器内部检查一下有没有为当前浏览器服务的session
2.如果有就直接拿过来用,如果没有session就创建一个新的session拿过来用。
3.接着将数据保存在Session中,做出响应。
2.如果有就直接拿过来用,如果没有session就创建一个新的session拿过来用。
3.接着将数据保存在Session中,做出响应。
Session API操作:
创建:
- request.getSession
操作域对象中属性:
- setAttribute();
- getAttribute();
- removeAttribute();
销毁:
- 超时销毁:默认超过30分钟Session没有被使用的话,会超时销毁
- 自杀:session.invalidate( )
- 意外:服务器非正常关闭