会话跟踪技术:
会话跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。
常用的会话跟踪技术:
(1) Cookie ----通过在客户端记录信息确定用户身份。
(2) Session ---通过在服务器端记录信息确定用户身份。
什么是Cookie?
由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理。
Cookie具有不可跨域名性。
cookies给网站和用户带来的好处非常多:
1、Cookie能使站点跟踪特定访问者的访问次数、最后访问时间和访问者进入站点的路径
2、Cookie能告诉在线广告商广告被点击的次数,从而可以更精确的投放广告
3、Cookie有效期限未到时,Cookie能使用户在不键入密码和用户名的情况下进入曾经浏览过的一些站点
4、Cookie能帮助站点统计用户个人资料以实现各种各样的个性化服务
创建Cookie
1. 通过page指令导入包(可省略)
<%@ page import="javax.servlet.http.Cookie" %>
2. 创建Cookie
Cookie newCookie=new Cookie("key",value);
3. 将Cookie响应到客户端
response.addCookie(newCookie);
在创建Cookie后,如未设置Cookie有效期,则该Cookie只保存在浏览上,当浏览重启后,之前设置的Cookie就不在了,要想Cookie真正保存在客户端上,就必须设置Cookie的保存时间。
处理Cookie的属性
在JSP中,程序是通过cookie.setXXX设置各种属性,用cookie.getXXX读出cookie的属性
类型 方法名方法解释
StringgetComment()返回cookie中注释,如果没有注释的话将返回空值.
StringgetDomain()返回cookie中Cookie适用的域名. 使用getDomain() 方法可以指示浏览器把Cookie返回给同一域内的其他服务器,而通常Cookie只返回给与发送它的服务器名字完全相同的服务器。注意域名必须以点开始(例如.yesky.com)
int getMaxAge()返回Cookie过期之前的最大时间,以秒计算。
StringgetName()返回Cookie的名字。名字和值是我们始终关心的两个部分,
StringgetPath()返回Cookie适用的路径。如果不指定路径,Cookie将返回给当前页面所在目录及其子目录下 的所有页面。
booleangetSecure()如果浏览器通过安全协议发送cookies将返回true值,如果浏览器使用标准协议则返回false值。
StringgetValue()返回Cookie的值。笔者也将在后面详细介绍getValue/setValue。
int getVersion()返回Cookie所遵从的协议版本。
void setComment(String purpose)设置cookie中注释。
void setDomain(String pattern)设置cookie中Cookie适用的域名
void setMaxAge(int expiry)以秒计算,设置Cookie过期时间。
void setPath(String uri)指定Cookie适用的路径。
void setSecure(boolean flag)指出浏览器使用的安全协议,例如HTTPS或SSL。
void setValue(String newValue)cookie创建后设置一个新的值。
void setVersion(int v)设置Cookie所遵从的协议版本。
读取客户端的Cookie
<%
//从提交的HTML表单中获取,用户名
String userName=request.getParameter("username");
//创建一个Cookie
Cookie theUsername=new Cookie("username",userName);
//将Cookie响应到客户端
response.addCookie(theUsername);
%>
..............
<%
//获取Cookie思路
//创建一个Cookie对象数组,读取用户硬盘中的Cookie放入该数组
Cookie[] myCookie = request.getCookies();
//设立一个循环,来访问Cookie对象数组的每一个元素
for(int n=0; n<cookie.length; i++){
//获得一个cookie对象
Cookie newCookie= myCookie[n];
//取得这个Cookie的名字
String sname=newCookie.getName();
//取得这个Cookie的内容
String svalue=newCookie.getValue();
//判断元素的值是否为username中的值
if(newCookie.getName().equals("username")){
out.print("你好,"+ newCookie.getValue());
}
}
%>
设置Cookie的有效期
Cookie cookie = new Cookie("username","helloweenvsfei"); // 新建Cookie
cookie.setMaxAge(Integer.MAX_VALUE); // 设置生命周期为MAX_VALUE 秒
response.addCookie(cookie); // 输出到客户端
如果maxAge为负数,则表示该Cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该Cookie即失效。
如果maxAge为0,则表示删除该Cookie。
cookie的域名
Cookie是不可跨域名的。域名www.google.com颁发的Cookie不会被提交到域名www.baidu.com去。这是由Cookie的隐私安全机制决定的。隐私安全机制能够禁止网站非法获取其他网站的Cookie。
正常情况下,同一个一级域名下的两个二级域名如www.helloweenvsfei.com和images.helloweenvsfei.com也不能交互使用Cookie,因为二者的域名并不严格相同。如果想所有helloweenvsfei.com名下的二级域名都可以使用该Cookie,需要设置Cookie的domain参数,例如:
Cookie cookie = new Cookie("time","20080808"); // 新建Cookie
cookie.setDomain(".helloweenvsfei.com"); // 设置域名
cookie.setPath("/"); // 设置路径
cookie.setMaxAge(Integer.MAX_VALUE); // 设置有效期
response.addCookie(cookie); // 输出到客户端
Cookie的路径
Cookie的路径
domain属性决定运行访问Cookie的域名,而path属性决定允许访问Cookie的路径(ContextPath)。例如,如果只允许/sessionWeb/下的程序使用Cookie,可以这么写:
Cookie cookie = new Cookie("time","20080808"); // 新建Cookie
cookie.setPath("/session/"); // 设置路径
response.addCookie(cookie); // 输出到客户端
设置为“/”时允许所有路径使用Cookie。path属性需要使用符号“/”结尾。name相同但domain相同的两个Cookie也是两个不同的Cookie。
注意:页面只能获取它属于的Path的Cookie。例如/session/test/a.jsp不能获取到路径为/session/abc/的Cookie。使用时一定要注意。
Cookie的安全属性
HTTP协议不仅是无状态的,而且是不安全的。使用HTTP协议的数据不经过任何加密就直接在网络上传播,有被截获的可能。使用HTTP协议传输很机密的内容是一种隐患。如果不希望Cookie在HTTP等非安全协议中传输,可以设置Cookie的secure属性为true。浏览器只会在HTTPS和SSL等安全协议中传输此类Cookie。下面的代码设置secure属性为true:
Cookie cookie = new Cookie("time", "20080808"); // 新建Cookie
cookie.setSecure(true); // 设置安全属性
response.addCookie(cookie); // 输出到客户端
提示:secure属性并不能对Cookie内容加密,因而不能保证绝对的安全性。如果需要高安全性,需要在程序中对Cookie内容加密、解密,以防泄密。
评论 (0)