会话技术简介
什么是会话
在日常生活中,从拨通电话到挂断电话之间的一连串的你问我答的过程就是一个会话。Web应用中的会话过程类似与生活中的打电话过程,它指的是一个(客户端)与Web服务器之间连续发生的一系列请求和响应过程,一个用户在某网站上的整个购物过程就是一个会话。
在打电话中,通话双方会有通话内容,同样,在客户端与服务器端交互的过程中,也会产生一些数据。例如用户a和用户b分别登陆了购物网站,a购买了一个小米手机,b购买了一部华为,当这两个用户结账时,Web服务器需要对用户a和b信息分别进行保存。我们知道Request和ServletContext对象都可以对数据进行保存,但是在这会话中这两个域对象不可行。
会话技术
从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话。
会话技术就是记录这次会话中客户端的状态与数据的。会话技术分为Cookie和Session:
Cookie:数据存储在客户端本地,减少服务器端的存储的压力,安全性不好,另外客户端可以清除cookie
Session:将数据存储到服务器端,安全性相对好,增加服务器的压力
Cookie
什么是Cookie
在现实生活中,当顾客早购物时,商城经常赠送顾客一张会员卡,卡上记录了用户的个人信息(姓名和电话等)、消费额度、积分额度等。顾客一旦接受了会员卡,以后每次光临商场时,都可以使用这张会员卡,商场也将根据会员卡上的消费记录计算会员优惠额度和累加积分。在Web应用中,Cookie的功能类似这张会员卡,当用户通过浏览器访问Web服务器时,服务器会给客户端发送一些信息,这些信息都保存在Cookie中。这样,当浏览器再次访问服务器时,都会在请求头中将Cookie发送给服务器,方便服务器对浏览器做出正确的响应。
Cookie技术是将用户的数据存储到客户端的技术,当下次访问的时候浏览器会自动携带Cookie的信息过来服务器。
Cookie在浏览器和服务器之间的传输过程
我们分为两方面学习:
1、服务器端怎样将一个Cookie发送到客户端
2、服务器端怎样接受客户端携带的Cookie
服务器端向客户端发送一个Cookie
Cookie cookie = new Cookie(String cookieName,String cookieValue);
PS : Cookie中不能存储中文
1. 设置Cookie在客户端的持久化时间:
cookie.setMaxAge(int seconds);
PS :如果不设置持久化时间,cookie会存储在浏览器的内存中,浏览器关闭cookie信息销毁(会话级别的cookie),如果设置持久化时间,cookie信息会被持久化到浏览器的磁盘文件里,过期浏览器自动删除该cookie信息
2. 设置Cookie的携带路径:
cookie.setPath(String path);
PS :如果不设置携带路径,那么该cookie信息会在访问产生该cookie的web资源所在的路径都携带cookie信息
另外:
cookie.setPath("/WEB05");
代表访问WEB05应用中的任何资源都携带cookie
cookie.setPath("/WEB05/cookieServlet");
代表访问WEB05中的cookieServlet时才携带cookie信息
3. 向客户端发送cookie
response.addCookie(Cookie cookie);
如果想删除客户端的已经存储的cookie信息,那么就使用同名同路径的持久化时间为0的cookie进行覆盖即可
代码演示:
服务器端怎么接受客户端携带的Cookie
cookie信息是以请求头的方式发送到服务器端的
代码演示:
案例一:记录用户的上次访问时间
Session
Session技术是将数据存储在服务器端的技术。当人们去医院就诊时,就诊人需要办理医院的就诊卡,该卡上只有卡号,而没有其它信息。当病人每次去医院就诊时,只要出示就诊卡,医务人员便可根据卡号查询到病人的就诊信息。Session技术就好比发放给病人的就诊卡和医院为每个病人保留病历档案的过程。当浏览器访问Web服务器时,Servlet容器就会创建一个Session对象和ID属性,其中Session对象就相当于病历档案,ID就相当于就诊号。当客户端后续访问服务器时,只要将标识号传递给服务器,服务器就能判断出该请求是哪个客户端发送的,从而选择与之对应的Session对象为其服务。所以说Session的实现是基于Cookie,Session需要借助于Cookie存储客户的唯一性标识JSESSIONID
Session保存用户信息的过程
1. 获得Session对象
HttpSession session = request.getSession();
此方法会获得专属于当前会话的Session对象,如果服务器端没有该会话的Session对象会创建一个新的Session返回,如果已经有了属于该会话的Session直接将已有的Session返回
实质就是根据JSESSIONID判断该客户端是否在服务器上已经存在session了
2. session也是一个域对象
Session也是存储数据的区域对象,所以session对象也具有如下三个方法:
session.setAttribute(String name,Object obj);
session.getAttribute(String name);
session.removeAttribute(String name);
3. Session对象的生命周期
创建:第一次执行request.getSession()时创建
销毁:
1 . 服务器(非正常)关闭时
2 . session过期/失效(默认30分钟)
那么问题来了,它从何时开始计算这30分钟呢?
就是 从不操作服务器端的资源开始计时
另外可以在该工程的web.xml中重新进行配置 eg:
3 . 手动销毁session
session.invalidate();
作用范围:默认在一次会话中,也就是说在,一次会话中任何资源公用一个session对象
代码演示:手动创建一个存储JSESSIONID的Cookie 为该cookie设置持久化时间
PS : 如果JSESSIONID丢失,即Cookie被销毁i,服务器在执行request.getSession()时会判断在创建新的Session,并将新的JSESSIONID响应回客户端。而之前的Session还不会立即被销毁,Session生命周期后自动销毁
案例二:实现验证码的校验
首先在生成验证码图片Servlet中获取四位字母验证码word,并且获得该会话的session,并存入数据word,也就是request.getSession().setAttribute("checkcode_session", word);
然后再LoginServlet中校验