Cookie与Session学习

一、会话的概念

Http协议是无状态协议,不能记住用户。为了扩充这种功能,出现了会话:web的跟踪技术,用于实现在一个会话内,分辨是否为同一个用户。
实现会话的两种机制:Cookie和Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。

二、Cookie机制

cookie的内容主要包括:名字,值,过期时间,路径和域。路径与域一起构成cookie的作用范围。

2.1 Cookie的常用属性
String name(); Cookie的名称
Object value(); Cookie的值,如果值为Unicocde字符,需要UTF-8编码,如果是二进制,需要Base64编码.
int maxAge(); Cookie的失效时间(默认为-1,表示仅当前浏览器内有效,关闭浏览器即失效);如果需要保持Cookie,则设置为正值,秒单位。如果为0,表示删除该Cookie。
String path(); Cookie的使用路劲,如果设置为“/sessionWeb/”,则只有contextPath为“/sessionWeb”的程序可以访问该Cookie。如果设置为“/”,则本域名下contextPath都可以访问该Cookie。注意最后一个字符必须为“/”

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

2.2、保存中文数据
中文与英文字符不同,中文属于Unicode字符,在内存中占4个字符,而英文属于ASCII字符,内存中只占2个字节。Cookie中使用Unicode字符时需要对Unicode字符进行编码,否则会乱码。

Cookie cookie = new Cookie("username",URLEncoder("琼恩.雪诺","UTF-8")); //编码中文
response.addCookie(cookie);

URLDecoder.decode(cookies[i].getValue(), "UTF-8");//获取时,再解码

2.3、Cookie的有效期

Cookie cookie = new Cookie("username","enzo");
cookie.setMaxAge(Integer.MAX_VALUE);   //如果为0,则删除
response.addCookie(cookie);            //无论是修改还是删除,这句是必须的

2.4、Cookie的修改和删除
Cookie并不提供修改、删除操作。如果要修改某个Cookie,只需要新建一个同名的Cookie,添加到response中覆盖原来的Cookie。

如果要删除某个Cookie,只需要新建一个同名的Cookie,并将maxAge设置为0,并添加到response中覆盖原来的Cookie。注意是0而不是负数。负数代表其他的意义。读者可以通过上例的程序进行验证,设置不同的属性。

注意:修改、删除Cookie时,新建的Cookie除value、maxAge之外的所有属性,例如name、path、domain等,都要与原Cookie完全一样。否则,浏览器将视为两个不同的Cookie不予覆盖,导致修改、删除失败。

2.5、Cookie的域名和路劲

正常情况下,同一个一级域名下的两个二级域名如www.helloweenvsfei.com和images.helloweenvsfei.com也不能交互使用Cookie,因为二者的域名并不严格相同。如果想所有helloweenvsfei.com名下的二级域名都可以使用该Cookie,需要设置Cookie的domain参数,例如:

Cookie cookie = new Cookie(“time”,”20080808”); // 新建Cookie
cookie.setDomain(“.hello.com”); // 设置域名
cookie.setPath(“/”); // 设置路径, cookie.setPath(“/session/”);
cookie.setMaxAge(Integer.MAX_VALUE); // 设置有效期
response.addCookie(cookie); // 输出到客户端

则该Cookie的使用范围: http:// .hello.com/
若使用注释中的路劲: http:// .hello.com/session/

注意:页面只能获取它属于的Path的Cookie。例如/session/test/a.jsp不能获取到路径为/session/abc/的Cookie。

三、Session机制

Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。

3.1、 Session的常用方法

void setAttribute(String attribute, Object value)
设置Session属性。value参数可以为任何Java Object。通常为Java Bean。value信息不宜过大。

String getAttribute(String attribute)
返回Session属性。

Enumeration getAttributeNames()
返回Session中存在的属性名Enumeration枚举集合。

void removeAttribute(String attribute)
移除Session属性

String getId()
返回Session的ID。该ID由服务器自动创建,不会重复

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

long getLastAccessedTime()
返回Session的最后活跃时间。返回类型为long

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

void setMaxInactiveInterval(int second); 设置Session的超时时间。单位为秒

boolean isNew(); 返回该Session是否是新创建的

void invalidate(); 使该Session失效

3.2、 Session的作用范围
因此同一机器的两个浏览器窗口访问服务器时,会生成两个不同的Session。但是由浏览器窗口内的链接、脚本等打开的新窗口(也就是说不是双击桌面浏览器图标等打开的窗口)除外。这类子窗口会共享父窗口的Cookie,因此会共享一个Session。

注意:新开的浏览器窗口会生成新的Session,但子窗口除外。子窗口会共用父窗口的Session。例如,在链接上右击,在弹出的快捷菜单中选择“在新窗口中打开”时,子窗口便可以访问父窗口的Session。

3.3、 Cookie失效时,其他方式支持Session

URL地址重写(常用):就是把jsessionid直接附加在URL路径的后面。
HttpServletResponse类提供了encodeURL(Stringurl)实现URL地址重写,例如:

String url =request.getContextPath()+ "/servlet/BuyServlet?id=" + book.getId();
url = response.encodeURL(url);//将超链接的url地址进行重写
<a href=url>购买</a>
//在URL参数的前面添加了字符串“;jsessionid=XXX”。其中XXX为Session的id

response. encodeRedirectURL(java.lang.String url) 和response. encodeURL(java.lang.String url)是两个非常智能的方法,当检测到浏览器没有禁用cookie时,那么就不进行URL重写了,也就是如果客户端支持Cookie,生成原URL地址,如果不支持Cookie,传回重写后的带有jsessionid字符串的地址。

注意:TOMCAT判断客户端浏览器是否支持Cookie的依据是请求中是否含有Cookie。尽管客户端可能会支持Cookie,但是由于第一次请求时不会携带任何Cookie(因为并无任何Cookie可以携带),URL地址重写后的地址中仍然会带有jsessionid。当第二次访问时服务器已经在浏览器中写入Cookie了,因此URL地址重写后的地址中就不会带有jsessionid了。

表单隐藏字段实现Session:

<form name="testform" action="/xxx">
    <input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
    <input type="text" value="xxx">
     ……
    <input type="submit" value="提交">
</form>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值