浅谈【Cookie与Session技术】

[来源] 达内    [编辑] 达内   [时间]2013-08-13

将客户端与服务器之间多次交互当做一个整体来看,并且将多次交互所涉及的数据(状态)保存下来。 会话:当用户打开浏览器,访问多个WEB资源,然后关闭浏览器的过程,称之为一个会话,选项卡,弹出页面都属于这个会话,且共享同一个session。

参赛学员:王巍俊

获奖奖项:三等奖

一、     什么是状态管理

 

将客户端与服务器之间多次交互当做一个整体来看,并且将多次交互所涉及的数据(状态)保存下来。

会话:当用户打开浏览器,访问多个WEB 资源,然后关闭浏览器的过程,称之为一个会话,选项卡,弹出页面都属于这个会话,且共享同一个session

注意:具体会话和浏览器版本,厂商有关,如IE7及以下,每开一个浏览器都创建一个新的 session,而IE8 及以上,则实现多个浏览器共享同一个session。因为 IE8 及以上,都共享同一个进程,只开辟一个内存空间。目前较多主流的浏览器都实现同一台主机上的多个浏览器,共享同一个进程。

二、     如何进行状态管理

方式一:将状态保存在客户端。

方式二:将状态保存在服务器端。

 

三、 cookie技术(客户端技术)

(1) 什么是cookie

a、       cookie 是一种客户端的状态管理技术

b、       当浏览器向服务器发送请求的时候,服务器会将少量的数据以 set-cookie

b、 息头的方式发送给浏览器,当浏览器再次访问服务器时,会将这些数据以cookie 消息头的方式发送给服务器。

(2) 如何创建一个cookie

Cookie c = new Cookie(String name,String value);

response.addCookie(c)

默认情况下, cookie保存在浏览器内存中

(3)cookie 的查询

Cookie[] request.getCookies();

注意:该方法有可能返回null

String cookie.getName() :查找cookie的名字

String cookie.getValue() :查找cookie的值

(4)cookie 的生存时间

cookie.setMaxAge(int seconds) cookie 的保存时间

seconds>0 :浏览器会将cookie 保存在硬盘上,超过指定时间会删除该 cookie

seconds<0 :缺省值,只将cookie 保存在内存中,只要浏览器不关闭, cookie就一致保存,浏览器一旦关闭,cookie 就会被清空。

seconds=0 :立即删除cookie,如要删除一个叫 userID cookie,那么可以这么做:

Cookie c = new Cookie("userID","");

c.setMaxAge(0);

response.addCookie(c);

(5)cookie 的编码问题

cookie 只能保存ascii 字符,对于不合法的字符(如中文)需要转换成 ascii

例: Cookie cookie3 = new Cookie("realname",URLEncoder.encode("姓名 ","utf-8"));

(6)cookie 的路径问题

a、       什么是cookie 的路径问题?

浏览器在向服务器发送请求时,会比较cookie的路径要与访问的服务器的路径是否匹配,只有匹配的 cookie才会发送给服务器。

b、       cookie的默认路径

默认路径等于创建该 cookie的组件路径

c、        匹配规则

浏览器要访问的路径必须是cookie的路径或者其子路径时,才会发送对应的 cookie

d、       设置cookie 的路径

cookie.setPath(String path)

如: cookie.setPath("/appname");这样保证这个cookie 可以被整个web应用访问。

(7)cookie

setDomain :设置cookie域,指的是访问某个域的时候,才会带入 cookie,访问其他域,不会带入cookie

默认会禁止该设置,因为安全性较差,如,访问baidu.combaidu.com 写一个域是google.com cookie ,那么访问google.com的时候会带入 baidu.comcookie ,从而会实现攻击的效果。

(8)cookie 的限制

a、       cookie可以被用户禁止

b、       cookie 不完全,敏感数据,比如密码、账号等需要加密。

c、        cookie的大小有限制,大约为 4K左右

d、       cookie的个数也有限制,大约是 300个左右

e、        每个站点最多保存20 cookie

f、         cookie只能够保存字符串。

 

四、    session 技术(服务器端)

(1) 什么是session

a、       session 是一种服务器端的状态管理技术。

b、       session是基于 cookie的技术。

c、        当浏览器访问服务器时,服务器会创建一个 session 对象(该对象有一个唯一的id号,称之为 sessionId)服务器在默认的情况下,会将sessionId cookie的方式,发送给浏览器,浏览器会将 sessionId保存到内存中。当浏览器再次访问服务器时,会将sessionId 发送给服务器,服务器依据sessionId就可以找到之间创建的session 对象。

(2) 如何获取session对象?

方式一:

HttpSession s = request.getSession(boolean flag);

flag=true时,服务器会先查看请求当中有没有sessionId ,如果没有,则创建一个session对象。如果有,会依据 sessionId查找对应的session 对象。如果找到,则返回该 session对象,如果找不到,则创建一个新的session 对象。

flag=false时,服务器会先查看请求当中有没有sessionId ,如果没有则返回null,如果有,会依据 sessionId 查找对应的session对象。如果找到,则返回该 session对象,如果找不到,返回null

 

方式二:

HttpSession s = request.getSession();

等价于 request.getSession(true);

(3) 常用方法

//  得到session ID

String serssion.getId();

// obj 最好实现序列化Serializable接口,应为服务器在持久化 session时,会使用java 序列化协议。

session.setAttribute(String name,Object obj);

//  如果name不存在则返回 null

session.getAttribute(String name);

//  删除session中的指定属性

session.removeAttribute(String name);

(4)session 超时

所谓 session的超时,指的是服务器会将空闲时间过长的session 对象从内存空间删除掉,原因是过多的session 对象会影响程序的正常运行,会占用服务器的内存空间。

大部分服务器都会有一个缺省的超时限制,一般是30分钟,可以修改服务器的缺省超时限制。如修改 tomcatsession超时时间,可以在 conf/web.xml中的<session-config> 中修改。

        <session-config>

        <session-timeout>30</session-timeout>

</session-config>

也可以将以上配置放到某个 WEB应用的web.xml 中,这样可以特定设置某个WEB应用的session 超时时间。

另外,还可以通过 session.setMaxInactiveInterval(int seconds);设置session 的超时时间。

(5)session 的生命周期

session 的创建:当用户访问某个可以创建session servlet的时候,该servlet才会创建 session

session超过默认时间或用户指定的session 时间后,session才会消亡。

 

(6) 删除session

session.invalidate();

(7) 持久化session方案

session 默认是存储在浏览器内存中,默认时间是30 分钟(根据不同的 WEB服务器设置而定)。且session 也是通过cookie来实现发送到浏览器内存中的。所以可以考虑用 cookie 来替换该session 。如果用户在中途关闭浏览器的话,那么 session就随着浏览器内存的释放而释放,那么如果想持久化session 的话,可以考虑使用cookie技术。

Step1 、获取sessionID

Step2 、通过JSESSIONID,然后将 sessionID 的值写入cookie ,在通过设置保存时间,路径,来持久化该 session

(8)URL 地址编码(用户禁用cookie的解决办法)

如果用户禁用了 cookie,那么在编写超链接的时候,必须使用URL 编码,即:response. encodeURL(url);

什么是URL重写?

简单的说,如果某个组件需要session机制的支持,且用户禁止了 cookie ,则不能直接使用该组件的地址去访问,而应该使用服务器生成的组件的地址(会在组件的地址后面添加sessionId )去访问。

如何重写?

用在连接地址,表单提交地址。

response.encodeURL(String url);

如果是重定向。

sesponse.encodeRedirectURL(“list.jsp”);

这样编译过的 URL地址就会自动在后面添加用户session id 号,那么所有的连接地址就会按如下格式进行输出,即每个地址都记录了用户的信息: href='/JavaWeb/servlet/BuySession;jsessionid=283087307F0E79CC62208BDCF79FC52A'

这种方式不能实现用户数据持久化。

(9)session 的相关细节

如果即使用了 URL地址编码,也设置了写出cookie ,那么第一次访问的时候服务器会即带入cookie 同时也进行 URL地址编码,当再次访问服务器时,服务器已经判断出了浏览器是否禁用了cookie ,如果没有禁用,则使用cookie 写入的方式,如果禁用了则使用 URL地址编码的方式

(10)      session的优缺点

优点:

1、        session相对安全。

2、        session 能够保存的数据类型更丰富。

3、        session 能够保存的数据大小没有限制。

 

缺点:

1、        session 需要将所有数据写在服务器端,所以服务器会占用过多的内存空间,会影响服务器性能。可以考虑使用cookie 或数据库来保存数据。

(11)      session案例

a、    session登录验证

step1 、在登录成功以后,在session 对象上绑定数据,比如: session.setAttribute(“user”,user)

step2 、对需要保护的资源(只有登录成功以后才能访问的资源,比如主页),添加session 验证代码:

Object obj = session.getAttribute(“user”);

If(obj==null) 就跳转到登录界面

b、    验证码

生成一个验证码,然后将验证码存储到session中,然后从session 中取出验证码与客户提交的验证码进行比对,这是一个典型的session 应用

网友评论 已有 0 条评论,查看更多评论»

评论内容:
验证码:
【网友评论仅供其表达个人看法,并不表明本站同意其观点或证实其描述。】

就业案例

最新开课信息