一、会话跟踪技术
会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应。例如你给10086打个电话,你就是客户端,而10086服务人员就是服务器了。从双方接通电话那一刻起,会话就开始了,到某一方挂断电话表示会话结束。在通话过程中,你会向10086发出多个请求,那么这多个请求都在一个会话中。
在JavaWeb中,客户向某一服务器发出第一个请求开始,会话就开始了,直到客户关闭了浏览器会话结束。
在一个会话的多个请求中共享数据,这就是会话跟踪技术。
二、Cookie
1 Cookie概述
1.1 什么是Cookie?
Cookie翻译成中文是小甜点、小饼干的意思。在HTTP中它表示服务器送给客户端浏览器的小甜点。其实Cookie就是一个键和一个值构成的,随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器。
Cookie是由服务器创建,然后通过响应发送给客户端的一个键值对。客户端会保存Cookie,并会标注出Cookie的来源(哪个服务器的Cookie)。当客户端向服务器发出请求时会把所有这个服务器Cookie包含在请求中发送给服务器,这样服务器就可以识别客户端了。
1.2 Cookie规范
····Cookie大小上限为4KB;
····一个服务器最多在客户端浏览器上保存20个Cookie;
····一个浏览器最多保存300个Cookie
2 Cookie的生命周期
Cookie不仅仅只有name和value,它还有生命。所谓Cookie的生命就是Cookie在客户端的有效时间,可以通过setMaxAge(int)来设置Cookie的有效时间。
1)cookie.setMaxAge(-1):cookie的maxAge属性的默认值就是-1,表示只在浏览器内存中存活,一旦关闭浏览器窗口,那么Cookie就会消失、死亡。
2)cookie.setMaxAge(60*60):表示Cookie对象可存活一小时。当生命大于0时,浏览器会把Cookie保存到硬盘上而不是浏览器的缓存中,此时就算关闭浏览器,就算重启客户端电脑,Cookie也会存活一小时。
3)cookie.setMaxAge(0):Cookie生命等于0是一个特殊的值,它表示Cookie被作废!也就是说,如果原来浏览器已经保存了这个Cookie,那么可以通过Cookie的setMaxAge(0)来删除这个Cookie。无论是在浏览器内存中,还是在客户端硬盘上都会删除这个Cookie。
三、HttpSession
1 HttpSession概述
1.1 什么是HttpSession
javax.servlet.http.HttpSession接口表示一个会话,我们通常把一个会话内需要共享的数据保存到HttpSession对象中。
1.2 如何获取HttpSession对象
HttpSession session = request.getSession();
注:如果当前会话已经存在,则直接返回session对象;如果当前会话还不存在,那么创建session并返回。
2 HttpSession的实现原理
举例:
当我第一次去某一银行时,由于还没有账号,所以需要开一个账号,我获得的是银行卡,而银行这边的数据库中留下了我的账号,我的钱是保存在银行的账号中,而我带走的是我的卡号。当我再次去银行时,只需要带上我的卡,而无需再次开一个账号了。只要带上我的卡,那么我在银行操作的一定是我的账号!
理解:
当首次使用session时,服务器端要创建session,session是保存在服务器端,而给客户端的session的id(一个cookie,它保存了sessionId)。客户端带走的是sessionId,而数据是保存在session中。当客户端再次访问服务器时,在请求中会带上sessionId,而服务器会通过sessionId找到对应的session,而无需再创建新的session。
3 HttpSession与浏览器
session保存在服务器,而sessionId通过Cookie发送给客户端,但这个Cookie的生命周期为-1,即只在浏览器内存中存在,也就是说如果用户关闭了浏览器,那么这个Cookie就丢失了。
当用户再次打开浏览器访问服务器时,就不会有sessionId发送给服务器,那么服务器会认为你没有session,所以服务器会创建一个session,并在响应中把sessionId放到Cookie中发送给客户端。
那原来的session对象会怎样?当一个session长时间没人使用的话,服务器会把session删除了!这个时长在Tomcat中配置是30分钟,可以在${CATALANA}/conf/web.xml找到这个配置,当然你也可以在自己的web.xml中覆盖这个配置!
<session-config>
<session-timeout>30</session-timeout>
</session-config>
session失效时间也说明一个问题!如果你打开网站的一个页面开始长时间不动,超出了30分钟后,再去点击链接或提交表单时你会发现,你的session已经丢失了!
4 HttpSession的URL重写
我们知道Session依赖Cookie,那么Session为什么依赖Cookie呢?因为服务器需要在每次请求中获取SessionId,然后找到客户端的Session对象。那么如果客户端浏览器关闭了Cookie呢?那么Session是不是就会不存在了呢?
其实还有一种方法让服务器收到的每个请求中都带有SessioinId,那就是URL重写!在每个页面中的每个链接和表单中都添加名为JSessionId的参数,值为当前sessionid。当用户点击链接或提交表单时也服务器可以通过获取JSessionId这个参数来得到客户端的SessionId,找到Sessoin对象。
4.1 方式一
index.jsp
<body>
<h1>URL重写</h1>
<a href='/day06_5/index.jsp;jsessionid=<%=session.getId() %>' >主页</a>
<form action='/day06_5/index.jsp;jsessionid=<%=session.getId() %>' method="post">
<input type="submit" value="提交"/>
</form>
</body>
注意:在index.jsp后面使用的是分号,而不是问号,这是服务器对jsessionid这个参数的特殊要求。
4.2 方式二
使用response.encodeURL()对每个请求的URL处理,这个方法会自动追加jsessionid参数,与上面我们手动添加是一样的效果。
<a href='<%=response.encodeURL("/day06_5/index.jsp") %>' >主页</a>
<form action='<%=response.encodeURL("/day06_5/index.jsp") %>' method="post">
<input type="submit" value="提交"/>
</form>
使用response.encodeURL()更加“智能”,它会判断客户端浏览器是否禁用了Cookie,如果禁用了,那么这个方法在URL后面追加jsessionid,否则不会追加。
四、Session和Cookie的区别
1、Session保存在服务器端,Cookie保存在客户端浏览器中。
2、Session将数据信息保存在服务器上,访问增多时,会增加服务器的压力,考虑性能会考虑到Cookie。
3、Cookie将SessionId保存在客户端浏览器上,别人可以分析存储在本地的Cookie进行Cookie诈骗,考虑安全使用Session。
4、Session的运行依赖SessionId,而SessionId是存在Cookie中的,也就是说,如果浏览器禁用了Cookie,同时Session也会失效,但是可以通过其他方式实现,比如在URL中传递SessionId。
温馨提示:
1、登陆的个人重要信息保存到session中,其他信息要保存的话可以放在cookie中。
2、如果不给cookie设置过期时间,默认关闭浏览器时(浏览器和服务器会话结束),cookie就会被清除掉。