一、会话管理概述
1、什么是会话?
好比一次通话。打开浏览器,点击多次链接(发出多次请求和收到多次的响应),关闭浏览器,这个过程就是一次会话。
2、解决的问题是什么?
共享多次请求中产生的数据。比如购物车。
二、客户端技术:Cookie
1、概述
Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理就是给用户各自的数据了。
2、HTTP协议的消息头
请求消息头:Cookie 客户端向服务器端传递信息
响应消息头:Set-Cookie 服务器端向客户端传递信息
3、Cookie详解:
3.1属性:
3.1.1必选属性
⑴name:Cookie的名称,必要的属性
⑵value:Cookie的取值(不能为中文),必要的属性
3.1.2可选属性
⑴path:Cookie的路径
默认值就是写cookie的那个资源的访问路径
比如:http://localhost:8088/day09/servlet/CookieDemo1 其中path就是/day09/servlet/
①如果一个存在浏览器缓存中的cookie的路径是/day09/servlet/
当访问http://localhost:8088/day09/CookiePathDemo1时(注意没有了servlet/),浏览器根本不带Cookie给服务器。浏览器比对的是cookie的路径和当前访问的资源的路径。
②浏览器满足以下条件就会带cookie给服务器:
当前访问的地址的路径.startWith(已存cookie的路径)。
“/day09/servlet/”.startWith(“/day09”)
即:如果一个Cookie的路径设置为了当前应用,说明访问该网站的任何资源时 浏览器都带该cookie给服务器。(开发中经常做的)
⑵maxAge:Cookie的最大生存时间(以秒为单位)。默认是在浏览器的内存中。若为0的话,则删除该cookie。
⑶domain:Cookie的域名(网站)。默认就是写cookie的那个资源所属的网站。
http://localhost:8088/day09/servlet/CookieDemo1域名就是localhost
⑷version:版本号
⑸comment:注释
3.2把Cookie写给客户端:
HttpServletResponse.addCookie(Cookie c):实际上就是向客户端发送了一个响应消息头。
即Cookie c = new Cookie(“name”,”value”);
response.addCookie(c);
注意:客户端只能保存一个网站最多20个Cookie数据,总共最多300个。每个Cookie的大小不能超过4kb。再更改Cookie的东西时候需要再写回去,负责服务器的Cookie还没变的。
3.3服务器端获取客户端带来的Cookie:
Cookie [] HttpServletRequest.getCookies();
即Cookie cs[] = request.getCookies();
注意:domain+path+name唯一确定一个Cookie。
3.4 默认Cookie的生命周期:
为浏览器会话期间,关闭浏览器,Cookie消失。存于浏览器的内存中。
这种生命周期称为会话cookie。
4、案例
⑴清除cookice记录
⑵显示用户最近的访问时间
三、服务器端技术:HttpSession
Session是服务端技术,利用这个技术,服务器在运行时可以为每个用户的浏览器创建一个其独享的HttpSession对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放入各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。得到session方法是request.getSession();
1、HttpSession是一个域对象及HttpSession的原理
request.getSession() ; --得到session
void setAttribute(String name,Object value); --用来设置session的值,name是session的名称,value是你要存的值
Object getAttribute(String name); --根据name获得set进去的value值
void removeAttribute(String name);
String getId();
--服务器在创建HttpSession时候会有一个独一无二的uuid,这个方法是获取这个ID的。
--当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识,称为Session ID ,如果已包含则说明以前已经为此客户端创建过session,服务器就按照Session ID 把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含Session ID ,则为此客户端创建一个session并且生成一个与此session相关联的Session ID ,Session ID 的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个Session ID 将被在本次响应中返回给客户端保存。保存这个Session ID 的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID。但cookie可以被人为的禁止,则必须有其他机制以便在cookie被禁止时仍然能够把Session ID 传递回服务器。
JSESSIONID是客户端用来保存Session ID 的变量,主要是针对j2ee实现的web容器,只有通过jsessionid才能使session机制起作用,而jsessionid又是通过cookie来保存。JSESSIONID就是session存在cookies中的key值。
HttpSession request.getSession(boolean b):
b如果为true,和getSession()完全一样的
b为false,服务器只是查找,找不到不会创建新的,返回null。
HttpSession.invalidate();使HttpSession对象立即失效。
2、案例:
完成用户的登录
3、客户端禁用Cookie后的会话数据的保持
当一个 Session 开始时,Servlet 容器将创建一个 HttpSession 对象,Servlet 容器为 HttpSession 分配一个唯一标识符,称为 Session ID。Servlet 容器将 Session ID 作为 Cookie 保存在客户的浏览器中。每次客户发出 HTTP 请求时,Servlet 容器可以从 HttpRequest 对象中读取 Session ID,然后根据 Session ID 找到相应的 HttpSession 对象,从而获取客户的状态信息。 当客户端浏览器中禁止 Cookie,Servlet 容器无法从客户端浏览器中取得作为 Cookie 的 Session ID,也就无法跟踪客户状态。 (以老版本IE为例)
客户端永远不会向服务器端带任何cookie。
解决办法:
方式一:文字提示:请不要禁用您的Cookie
方式二:Servlet容器可以重写客户请求的URL,把Session ID添加到URL信息中。在访问的地址后面加上JSESSIONID=session的id,可以对URL重写。注意重写的话需要对网站的所有地址重写。因为如果有一个地址没有重写的话,服务器会创建新的session。
http://localhost:8080/servlet/ServletDemo1
http://localhost:8080/servlet/ServletDemo1;JSESSIONID=123
response.encodeURL(String url);//禁用就自动重写,没禁用不重写。
●先判断当前的Web组件是否启用Session,如果没有启用Session,直接返回参数 url。
●再判断客户端浏览器是否支持Cookie,如果支持Cookie,直接返回参数url;如果不支持Cookie,就在参数url中加入SessionID信息,然后返回修改后的url。示例如下:
String url = request.getContextPath()+"/servlet/HttpSessionDemo2";
response.encodeURL(url);//重写
4、HttpSession对象的状态
⑴更改HttpSession死亡状态超时:在web.xml里面
⑵对象的序列化:Java允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即这些对象的生命周期不会比JVM的生命周期更长。但在现实应用中,就可能要求在JVM停止运行之后能够保存(持久化)指定的对象,并在将来重新读取被保存的对象。Java对象序列化就能够帮助我们实现该功能。
四、HttpSession与Cookie区别
1、客户端技术Cookie:把用户的数据写给用户的浏览器。而且这个数据容易被伪造。
2、服务端技术HttpSession:把用户的数据写给服务器端的对象里面。服务器使用一种类似于散列表的结构来保存信息。