服务端技术|Cookie&Session
服务端技术|Cookie&Session
叶一片第一章 会话
1.1. 什么是会话?
会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。
2.2. 会话过程中要解决的一些问题?
每个用户与服务器进行交互的过程中,各自会有一些数据,程序要想办法保存每个用户的数据。
例如:用户点击超链接通过一个servlet购买了一个商品,程序应该保存用户购买的商品,以便于用户点结帐servlet时,结帐servlet可以得到用户商品为用户结帐。
1.3. 保存会话数据的两种技术:
Cookie
Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
Session
Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
第二章 Cookie技术
二.1. 常用方法
二.2. 工作原理
工作原理:
- 创建cookie
当用户第一次浏览某个使用Cookie的网站时,该网站的服务器就进行如下工作:
①该用户生成一个唯一的识别码(Cookie id),创建一个Cookie对象;
②默认情况下它是一个会话级别的cookie(默认生命周期–>一个会话),存储在浏览器的内存中,用户退出浏览器之后被删除。如果网站希望浏览器将该Cookie存储在磁盘上,则需要设置最大时效(maxAge),并给出一个以秒为单位的时间(将最大时效设为0则是命令浏览器删除该Cookie);
③将Cookie放入到HTTP响应报头,将Cookie插入到一个 Set-Cookie HTTP响应报头中。
④发送该HTTP响应报文。 - 设置存储cookie
浏览器收到该响应报文之后,根据报文头里的Set-Cookied特殊的指示,生成相应的Cookie,保存在客户端。该Cookie里面记录着用户当前的信息。 - 发送cookie
当用户再次访问该网站时,浏览器首先检查所有存储的Cookies,如果存在该网站的Cookie,则把该cookie附在请求资源的HTTP请求头上发送给服务器。 - 读取cookie
服务器接收到用户的HTTP请求报文之后,从报文头获取到该用户的Cookie,从里面找到所需要的东西。
- 作用:
Cookie的根本作用就是在客户端存储用户访问网站的一些信息。典型的应用有:
1、记住密码,下次自动登录。
2、记录用户浏览数据,进行商品(广告)推荐。
3、缺陷:
①Cookie会被附加在每个HTTP请求中,所以无形中增加了流量。
②由于在HTTP请求中的Cookie是明文传递的,所以安全性成问题。(除非用HTTPS)
③Cookie的大小限制在4KB左右。对于复杂的存储需求来说是不够用的。
2.3. Cookie细节
Cookie不可以存储中文:如果要存储中文,要编码,还要解码
案例:
显示用户上次访问时间
1.判断用户是否是第一次访问
2.如果是第一次访问,需要输出欢迎,并且记录当前的时间,保存到cookie中,再回写到浏览器端。
3.如果不是第一次访问,获取cookie中的时间,输出时间,并且记录当前的时间,保存到cookie中,再回写到浏览器端。
第三章 Session技术
在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
Session和Cookie的主要区别在于:
Cookie是把用户的数据写给用户的浏览器。
Session技术把用户的数据写到用户独占的session中(服务器端)。
Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。
3.1. session创建和销毁
问:getSession是获得Session还是创建Session?
getSession方法,如果没有session则创建,如果有则获取
3.2. 设置有效时间
session.setMaxInactiveInterval(30*60);//以秒为单位,即在没有活动30分钟后,session将失效
Session的有效时间,从什么时候开始算?
会话停止活动开始计算,如果一直都活动,都会从头开始
3.3. 案例:验证码用户登陆
利用Session实现一次性验证码用户登陆
在生成的验证码的servlet中使用session存入生成的验证码(使用StringBuffer拼接字符)
在校验的servlet中获取表单输入的验证码和session中保存的验证码
获取到两个不同来源的验证码后做对比
为什么要使用验证码?
一次性验证码的主要目的就是为了限制人们利用工具软件来暴力猜测密码。
服务器程序接收到表单数据后,首先判断用户是否填写了正确的验证码,只有该验证码与服务器端保存的验证码匹配时,服务器程序才开始正常的表单处理流程。
密码猜测工具要逐一尝试每个密码的前题条件是先输入正确的验证码,而验证码是一次性有效的,这样基本上就阻断了密码猜测工具的自动地处理过程。
第四章 面试题
4.1. cookie 和session 的区别:
cookie 和session 的区别:
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用COOKIE。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
5、所以建议:
将登陆信息等重要信息存放为SESSION
其他信息如果需要保留,可以放在COOKIE中
4.2. Session的生命周期?
第一次执行request.getSession()时创建 (如果没有存在,那么就应该创建)
销毁:
1)服务器(非正常)关闭时
2)session过期/失效(默认30分钟)
问题:时间的起算点 从何时开始计算30分钟?
从不操作服务器端的资源开始计时
可以在项目工程中的web.xml中进行配置
1 | <session-config> |
3)手动销毁session(非正常关闭)
session.invalidate();
作用范围:
默认在一次会话中,也就是说在,一次会话中任何资源公用一个session对象
4.3. 浏览器关闭,session就销毁了吗?
不会销毁
当一个Session开始时,Servlet容器会创建一个HttpSession对象,那么在HttpSession对象中,可以存放用户状态的信息
Servlet容器为HttpSession对象分配一个唯一标识符即Sessionid,Servlet容器把Sessionid作为一种Cookie保存在客户端的 浏览器 中
用户每次发出Http请求时,Servlet容器会从HttpServletRequest对象中取出Sessionid,然后根据这个Sessionid找到相应的HttpSession对象,从而获取用户的状态信息
以上就是Session的运行机制,
其实让Session结束生命周期,有以下两种办法:
一个是Session.invalidate()方法,不过这个方法在实际的开发中,并不推荐,可能在强制注销用户的时候会使用;
一个是当前用户和服务器的交互时间超过默认时间后,Session会失效
我们知道Session是存在于服务器端的,当把浏览器关闭时,浏览器并没有向服务器发送
任何请求来关闭Session,自然Session也不会被销毁,但是可以做一点努力,在所有的
客户端页面里使用js的window.onclose来监视浏览器的关闭动作,然后向服务器发送一
个请求来关闭Session,但是这种做法在实际的开发中也是不推荐使用的,最正常的办法
就是不去管它,让它等到默认的时间后,自动销毁
那么为什么当我们关闭浏览器后,就再也访问不到之前的session了呢?
其实之前的Session一直都在服务器端,而当我们关闭浏览器时,此时的Cookie是存在
于浏览器的进程中的,当浏览器关闭时,Cookie也就不存在了。
其实Cookie有两种:
一种是存在于浏览器的进程中;
一种是存在于硬盘上
而session的Cookie是存在于浏览器的进程中,那么这种Cookie我们称为会话Cookie,
当我们重新打开浏览器窗口时,之前的Cookie中存放的Sessionid已经不存在了,此时
服务器从HttpServletRequest对象中没有检查到sessionid,服务器会再发送一个新的存
有Sessionid的Cookie到客户端的浏览器中,此时对应的是一个新的会话,而服务器上
原先的session等到它的默认时间到之后,便会自动销毁。
ps:
当在同一个浏览器中同时打开多个标签,发送同一个请求或不同的请求,仍是同一个session;
当不在同一个窗口中打开相同的浏览器时,发送请求,仍是同一个session;
当使用不同的浏览器时,发送请求,即使发送相同的请求,是不同的session;
当把当前某个浏览器的窗口全关闭,再打开,发起相同的请求时,是不同的session,但是它和session的生命周期是没有关系的.