会话技术(Cookie与Session)揭密

一、什么是会话技术

简单的说:客户开一个浏览,点击多个超链接,访问服务器多个Web资源,然后关闭浏览器,整个过程称之为一个会话。

问:若多个用户访问服务器产生了各自的数据需要保存,那么就可以用会话技术来保存了。

二、Cookie技术

1.      概念:cookie技术是客户端的技术,代表数据会保存在客户端中。服务器把每个用户的数据以cookie的形式写给用户各自的浏览器。这样当用户使用浏览器再去访问服务器的web资源时就会带着各自的cookie数据去

2.      Cookie API相关

2.1创建一个Cookie可以直接new Cookie(name,value)。如何写入进去,可以通过response.addCookie(cookie),它相当于response.setHeader(“set-cookie”,”name=value”)

2.2一个Cookie只能标识一种信息一个name,它至少含有一个namevalue属性。另外一个Web站点可以向浏览器发送多个cookie,但最多只能发20个。而且每个Cookie大小不能超过4KB.

而一个浏览器最多只能存放300Cookie。即Web浏览器存放了多个站点的Cookie

2.3 Cookie的属性有以下:

name属性必有。 Value唯一的值,取值必须有。  Comment:可选属性,注释。

Path路径。可选的,默认值:path。此path具有包含的性质,即/demo5path,可以对http://localhost/demo5/servlet/DE.do有效果,对http://localhost/demo5/1.do也有效果。但/demo5/servlet,只对http://localhost/demo5/servlet/DE.do有效果,而对http://localhost/demo5/1.do是没有效果。这个是有默认值的,访问http://localhost/demo5/servlet/DE.do,则respo.addCookiepath/demo5/servlet,而访问http://localhost/demo5/1.do,则respo.addCookiepath/demo5

Domain域名。访问地址http://localhost/demo5/servlet/ui.do默认值是localhost

maxAge最大存活。可选的,默认值是一次会话,在用户退出浏览器会自动消失。巧妙的利用这个属性,可以让用户的数据清空掉setMaxAge(0),或保存为一长段时间 setMaxAge(num)

注意:删除cookie时,必须保证path一致,否则不会删除掉。一般都是setPath(request.getContextPath())Name不能唯一定位Cookie,只有domain+path+name才能唯一定位Cookie

三、Session技术

1.      概念:session技术是服务器技术,代表数据会保存在服务器端中,便需要Cookie的支持(若客户端禁用了cookie了,那个客户端向服务器每个url请求最好服务器向客户端传url地址时,就用response.encodeURL)。服务器在运行时可以为每个用户的浏览器创建一个其独享的HttpSession对象,由于session为用户浏览器独享。所以用户在访问web服务器的web资源时可以把各自的数据放在各自的session中,当用户再访问其它的web资源时,其它的web资源就可以从session中取出用户自己的数据进行处理了。

2.      Session原理概述图:

会话技术(Cookie与Session)揭密_第1张图片

细节说明:

           Request.getSession,首先

2.1 会从请求中找nameJSESSIONIDcookie,找到取出JSESSIONID的值id。把此id从内存中相应的session对象。

2.2 若找不到session对象,则web容器会创建一session对象。并把此session对象idJSESSION-IDname-valuecookie形式存入的response.addCookie中。

2.3 或找到了session对象,则把此id值的session对象,从内存中取出来用。

2.4 下次客户端再次请求时会带的cookie的值来。这样同一次会话,同一jsessionid,所以同一会话中session的值可以共享保存。

 

注意:session的存活默认是30分钟,若30分钟之内浏览器没有进一步操作,那么30分钟之后,虽然浏览器再次带来此cookie值,但内存中session已经消亡了。而另一个情况是,session默认是1次会话存活着。所以关闭浏览器后,再打开后由于一次会话上次的cookie消失了,那么也取不到内存的session对象了。

request.getSession(boolean create):

create=true:作用等同于getSession()

          create=false:只获取不创建。

3.      客户端禁用Cookie后的会话数据保存问题

3.1当客户端禁用cookie后,如果访问地址是http://localhost,则禁用无效.(根据客户端的不同而不同),测试用是http://ip地址

URL重写:

http://127.0.0.1:8080/demo5/servlet/BuyServlet  oldUrl

http://127.0.0.1:8080/demo5/servlet/BuyServlet;JSESSIONID=23432432newUrl

3.2操作代码示例:response.encodeURL(oldUrl)------------>newUrl

           自动判断客户端有无禁用cookie,如果禁用了就重写url,没有禁用就不写了。

4.      HttpSession对象的生命周期和状态转换.

4.1修改session的默认超时时间

web.xml修改:

<session-config>

           <session-timeout>1</session-timeout>分钟,至少一分钟

</session-config>

4.2浏览器会话的界定:

IE

IE8+:开启的多个IE进程窗口共享同一个会话。

IE7-:开启一个新的IE进程不共享同一次会话。

新开的标签(Tab)页也属于同一次会话。

           通过<ahref="" target="_blank"/>开启的新窗口和原来的窗口属于同一次会话。

你可能感兴趣的:(会话技术(Cookie与Session)揭密)