浅谈Cookie和Session

一、会话跟踪技术

        会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应。例如你给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就会被清除掉。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术杠精

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值