java web笔记之会话跟踪cookie&session

来源:互联网 发布:双11淘宝付款生成器 编辑:程序博客网 时间:2024/04/25 21:20

1.cookie

cookie保存在客户浏览器中
创建cookie: Cookie cookie = new Cookie("key","value");

String编码设置:URLEncoder.encode("王大伟","utf-8")
cookie读取中文:URLDecoder.decode("王大伟", "UTF-8")

属性名

描述

String name

该cookie的名称,cookie一但 创建,名称便不可更改

Object value

该cookie的值,如果值为unicode字符,需要为字符编码。如果值为二进制数据,则需要使用BASE64编码

Int maxAge

该cookie失效的时间,单位为秒。如果为正数,则该cookie在maxAge秒之后失效。如果为负数,则cookie为临时cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该cookie。如果为0,表示删除该cookie.默认为-1

Boolean secure

该cookie是否仅被使用安全协议传输。安全协议。安全协议有HTTPS,SSL等,在网络上传输数据之前先将数据加密。默认为false。

String path

该cookie的使用路径。如果设置为”/session Web/”,则只有contextPath为”/sessionWeb”的程序可以访问该cookie。如果设置为”/”,则本域名下contextPath都可以访问该cookie。注意最后一个字符必须为”/”

String domain

可以访问该cookie的域名。如果设置为”.google.com”,则所有以”google.com”结尾的域名都可以访问该cookie。注意第一个字符必须为”.”

String comment

该cookie的用处说明。浏览器显示cookie信息的时候显示该说明

Int version

该cookie使用的版本号。0表示遵循Netscape的cookie规范,1表示遵循W3C的RFC2109规范。

 2.session

session保存在服务器上

方法名

描述

Void setAttribute(String attribute,object value)

设置session属性。Value参数可以为任何java object。通常java bean。Value信息不宜过大

String getAttribute(String attribute)

返回session属性

Enumeration getAttributeNames()

返回session中存在的属性名

Void removeAttribute(String attribute)

移除session属性

String getId()

返回session的ID。该ID由服务器自动创建,不会重复。

Long getCreationTime()

返回session的创建日期。返回类型为long,常被转化为Date类型,例如:Date createTime = new Date(session.getCreationTime())

Long getLastAccessedTime()

返回session的最后活跃时间。返回类型为long

Int getMaxInactiveInterval()

返回session的超时时间。单位为秒。超过该时间没有访问,服务器认为该session失效

Void setMaxInactiveInterval(int second)

设置session的超时时间。单位为秒

Void putValue(String attribute,object value)

不推荐的方法。已经被setAttribute(String attribute,object value)替代

object getValue(String attribute)

不推荐的方法。已经被getAttribute(String sttr)替代

Boolean isNew()

返回该session是否是新创建的

Void invalidate()

使该session失效

 Tomcat中session的默认超时时间为20分钟。通过setMaxInactiveInterval(int seconds)修改超时时间。还可以修改web.xml改变session的默认超时时间。例如修改为60分钟:

<session-config>  <session-timeout>60</session-timeout></session-config>
注:<session-timeout>参数的单位为分钟,而setMaxInactiveInterval(int s)单位为秒。

3.session与cookie比较

3.1从存取方式上比较

 cookie中只能保存ASCII字符串,如果需要存取unicode字符或者二进制数据,需要进行utf-8,gbk或者BASE64等方式的编码。cookie中也不能直接存取java对象。若要存储稍微复杂的信息,使用cookie是比较困难的。
 而session中可以存取任何类型的数据,包括而不限于String、Integer、list、map等。session中也可以直接保存java bean 乃至任何java类,对象等,使用起来非常方便。可以把session看做是一个java容器类。

3.2从隐私安全上比较

 cookie存储在客户端浏览器中,对客户端是可见的,客户端的一些程序可能会窥探、复制甚至修改cookie中的内容。而session存储在服务器上,对客户端是透明的,不存在敏感 信息泄露的危险。
 如果选用cookie,比较好的办法是,敏感的信息如账号密码等尽量不要写到cookie中。最好是像google、baidu那样将cookie信息加密,提交到服务器后再进行解密,保证cookie中的信息只有自己能读得懂。而如果选择session就省事多了,反正是放在服务器上,session里任何隐私都可以。

3.3从有效期上比较

 使用过google的人都知道,如果登陆过google,则google的登录信息长期有效。用户不必每次访问都重新登录,google会长久的记录该用户的登录信息。要达到这种效果,使用cookie会是比较好的选择。只需要设置cookie的maxAge属性为一个很大很大的数字或者Integer.MAX_VALUE就可以了。cookie的maxAge属性支持这样的效果。
 使用session理论上也能实现这种效果。只要调用方法setMaxInactiveInterval(Integer.MAX_VALUE)不就可以了么。但是由于session依赖于名为JSESSIONID的cookie,而cookie JSESSIONID的maxAge默认为-1,只要关闭了浏览器该session就会失效,因此session不能实现信息永久有效的效果。使用URL地址重写也不能实现。
 而且如果设置session的超时时间过长,服务器累计的session就会越多,越容易导致内存溢出。

3.4从对服务器的负担上比较

 session是保存在服务器端的,每个用户都会产生一个session。如果并发访问的用户非常多,会产生非常多的session,消耗大量的内存。因此像google、baidu、sina这样并发访问量极高的网站,是不太可能使用session来追踪客户会话的。
 而cookie保存在客户端,不占用服务器资源。如果并发浏览的用户非常多,cookie是很好的选择。对于google、baidu、sina来说,cookie也许是唯一的选择。

3.5从浏览器支持上比较

 cookie是需要客户端浏览器支持的。如果客户端禁用了cookie,或者不支持cookie,则会话跟踪会失效。对于WAP上的应用,常规的cookie就派不上用场了。
 如果客户端浏览器不支持cookie,需要使用session以及URL地址重写。需要注意的是所有的用到session程序的URL都需要使用response.encodeURL(String URL)或者response.encodeRedirectURL(String URL)进行URL地址重写,否则导致session会话跟踪失败。对于WAP应用来说,session+URL地址重写也许是它唯一的选择。
如果客户端支持cookie,则cookie既可以设为本浏览器窗口以及子窗口内有效(把maxAge设为-1),也可以设为所有浏览器窗口内有效(把maxAge设为某个大于0的整数)。但session只能在本浏览器窗口以及其子窗口内有效。如果两个浏览器窗口互不相干,它们将使用两个不同的session。

3.6从跨域名上比较

 cookie支持跨域名访问,例如将domain属性设置为".wangdawei.com",则以".wangdawei.com"为后缀的所有域名均可以访问该cookie。跨域名cookie现在被广泛用在网络中,例如google、baidu、sina等。而session则不会支持跨域名访问。session仅在他所在的域名内有效。



0 0
原创粉丝点击