您的位置:首页 > 理论基础 > 计算机网络

HttpSession、Cookie与会话跟踪

2018-01-16 21:25 357 查看
HTTP协议:无状态,无连接;因此为了解决HTTP协议的局限性而提出保持客户端和服务器间保持会话连接状态的机制(session与cookie)
实现会话跟踪的三种技术
cookies
SSL session
URL重写

HttpSession接口:
关于API中的说明:Provides a way to identify a user across more than one page request or visit to a Web site and to store information about that user. (提供一种方法,用户访问多个页面或者web站点时,用来标识该用户,并存储用户的相关信息)。
session表示会话(一系列有始有终的请求动作)
session由容器创建,并保存在服务器端,每个session都有唯一的标识ID(JSESSIONID),开发者可以通过向session中存储客户端的一些信息,当容器创建session时,会传递给客户端一个cookie,名称为JSESSIONID,存储内容为当前session的ID,当客户端(浏览器)关闭时,该sessionID失效,当前cookie销毁,但是,tomcat默认的超时时间为30分钟,即30分钟后销毁当前session对象
客户端每次发送有关session的请求时,tomcat会自动更新session的超时时间(最后一次请求之后的30分钟)

使用session的方法
HttpSession   request.getSession();//从请求内容中判断是否有sessionID,如果当前sessionID对应的session存在,则使用该对象,否则容器创建一个session对象,并将新的sessionID传给客户端
HttpSession  request.getSession(boolean create);//判断当前sessionID对应的session是否存在,如果不存在,则根据create的值判断是否创建新的session
Object  getAttribute(String name);//根据name获得对应的对象(Object对象),没有则返回null
void  setAttribute(String name,Object value);//设置属性,键值对的形式
void removeAttribute(String name);//删除name对应的对象
Enumeration  getAttributeNames();//获得所有的属性的name
String  getId();//获得对应的session Id
long  getLastAccessedTime();//获得客户端最后一次发送和session有关请求的时间
long  getCreationTime();//获得session的创建时间
int  getMaxInactiveInterval();//获得超时时间(时间单位:秒)
void setMaxInactiveInterval();//单独设置当前session的超时时间
void invalidate();//使当前session失效,并解除绑定(销毁)

在web.xml中配置超时时间
<session-config>
<session-timeout>时间</session-timeout>
</session-config>

*注意:在web.xml中配置的时间单位时分钟
Cookie类
Cookie对象由容器创建,存储一些文本信息(不超过4K),并发送给客户端,保存在客户端,当客户端发送请求时,浏览器会自动向服务器发送Cookies信息,所以会话跟踪可以由cookie实现
手动创建一个Cookie对象
Cookie cookie=new Cookie(String key,Stirng value);

因为Cookie大小不能超过4k,只能存储简单的字符串类型的键值对
Cookie类的常用方法
int getMaxAge();//获得Cookie的有效保存时间,-1表示当浏览器关闭时销毁,时间单位:秒
void setMaxAge();//设置Cookie的最大有效时间(秒)
String getName();//获得cookie的name(key)
String getValue();//获得cookie的value
String getPath();//获得当前cookie的服务器路径
void setValue(String newValue);//创建完Cookie之后,重新给value赋值
String getDomain();//获得此Cookie的域名
void setDomain(String pattern);//设置此Cookie的域名

创建Cookie对象,并发送给客户端的步骤
//1.创建一个Cookie
Cookie c=new Cookie("userName", name);
//2.设置Cookie的过期时间
c.setMaxAge(60*60*24*7);
//3.发送给客户端
response.addCookie(c);


从请求中获得Cookies
Cookie[] request.getCookies();

    使用request的getCookies();方法

session与cookie的分析比较
session存储在服务器端,安全性较高,对服务器性能要求也较高
session可以存储各种数据类型,cookie只能存储字符串
cookie存储在客户端,安全性较低,存储的数据较少(4k),对个数也有限制,客户端可以禁用cookie
session的唯一标识JSESSION通过cookie存储在客户端

URL重写

当cookie被禁用时,需要使用其他技术将session Id传回服务器,经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面发送给服务器。

还有一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。(可以使用URL重写技术实现)

简单测试
创建一个接收登录请求的Servlet,重写doGet方法
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name=request.getParameter("userName");
String password=request.getParameter("password");
if(name.equals("james")||name.equals("lishuai")||name.equals("1234")){
if(password.equals("123456")||password.equals("lishuai")){
//登录成功,服务器创建一个session
HttpSession session=request.getSession();
//设置当前session的有效时间 30s
session.setMaxInactiveInterval(30);
//设置session属性,名称为user,value为字符串,保存在服务器端
session.setAttribute("user", "========"+name+"--"+password+"========");
//1.创建一个Cookie Cookie c=new Cookie("userName", name); //2.设置Cookie的过期时间 c.setMaxAge(60*60*24*7); //3.发送给客户端 response.addCookie(c);
}else{
//重定向到登录页面
response.sendRedirect("login.html");
}
}else{
response.sendRedirect("login.html");
}
}


当登录成功后,可以在chrome浏览器中查看cookies



可以看到JSESSION中只存储了session id,有效期为浏览器会话结束


手动存储的cookie


创建一个处理session的Servlet类
重写doGet方法
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session=request.getSession();//(根据客户端的cookie得到session id)获得服务器中存在的session
if(session.getAttribute("user")!=null){
response.getWriter().println("你已经登陆过;上次登陆时间:"+new Date(session.getCreationTime())+":"+session.getAttribute("user")+":"+session.getMaxInactiveInterval());
}else{
response.sendRedirect("login.html");
}
}


用户登陆成功后,访问对应的URL
你已经登陆过;上次登陆时间:Tue Jan 16 21:20:37 CST 2018:========lishuai--123456========:30


创建一个处理cookies的Servlet
重写doGet方法
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//获得客户端发送的Cookies
Cookie[] cc=request.getCookies();
if(cc!=null){
//遍历输出
for(Cookie c:cc){
System.out.println(c.getName()+";"+c.getValue());
}
}
}


后台输出以下结果
userName;lishuai
JSESSIONID;E84D338A95F6A1B6E7B391409654660E
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: