Session和Cookie
来源:互联网 发布:c多线程编程实例 pdf 编辑:程序博客网 时间:2024/06/03 12:55
Session是属于服务器端生成和管理的对象,由于HTTP请求本身是无状态的,因此在服务器端使用Session来管理HTTP请求的状态。服务器端会把session对象存在内存中。
Cookie是属于浏览器前端的数据存储方案,数据存储于电脑本地磁盘上,在访问某个域名的服务时,浏览器会自动加载属于当前域的cookie数据,将cookie信息发送到服务器端。
[Cookie和Session的关联]
有一个名为"JESSIONID"的Cookie,客户端使用这个Cookie的值来表示对应的服务器端Session对象的ID。
在tomcat的实现中,如果服务器为当前请求生成了一个Session对象,则会自动在对应的response对象中添加一个这样的Cookie对象。
当请求中带有名为"JESSIONID"的cookie时,使用request对象来获取session对象时,就使用这个cookie的值去寻找已经存在的session对象。这样无状态的HTTP请求,就可以通过Cookie和Session对象关联起来
[Cookie的数据]
除了前述的名为"JESSIONID"的cookie是由tomcat自动创建和添加外,其它类型的Cookie需要开发人员显示地创建,并添加到HttpServletResponse对象中。
Cookie本身存在不同的生命周期。
[问题]
1、在浏览器禁用Cookie的情况下,如何能正确地将某次请求和session对象关联起来?
经自己的测试环境中,在浏览器禁用Cookie的情况下,在servlet中每次使用request.getSession(true)时,返回的session对象是不相同的。这是因为在浏览器禁用了Cookie的情况下,无法通过设置请求中的Cookie把JESSIONID的值传过来,所以无法采用默认的方式根据sessionId的值来获取session对象,每次都会创建一个新的session对象。
可以使用url重写,将sessionId作为一个参数传递到服务器端,举例如下 http://xxx:8080/session;jsessionid=13jl1jkuoqv0y1p8kw571d1rx0
只需要采用合适的方式,将sessionId传递到后端即可
[代码实例测试]
在代码的实际测试中,实际的类对象分别如下
request class:org.eclipse.jetty.server.Request
response class:org.eclipse.jetty.server.Response
session class:org.eclipse.jetty.server.session.HashedSession
session manager class:org.eclipse.jetty.server.session.HashSessionManager
从代码上看,在通过请求对象获取Session对象时,如果当前请求对象中没有session,则为当前请求创建一个session对象。并且会在返回对象中设置session对应的cookie
public HttpSession getSession(boolean create)
{
if (_sessionManager ==null && create)
throw new IllegalStateException("No SessionManager");
if (_session != null && _sessionManager!= null && _sessionManager.isValid(_session ))
return _session ;
_session= null;
String id=getRequestedSessionId();
if (id != null && _sessionManager!= null)
{
_session= _sessionManager.getHttpSession(id);
if (_session == null && !create)
return null ;
}
if (_session == null && _sessionManager!= null && create )
{
_session= _sessionManager.newHttpSession(this);
HttpCookie cookie=_sessionManager.getSessionCookie(_session ,getContextPath(),isSecure());
if (cookie!=null)
_connection.getResponse().addCookie(cookie);
}
return _session ;
}
1 0
- session和cookie
- Cookie和Session专题
- Cookie和Session专题
- Cookie和Session专题
- Cookie和Session专题
- 关于Session和Cookie
- Cookie和Session专题
- session 和 cookie
- Cookie和Session专题
- cookie和session
- 浅谈Session和Cookie
- Cookie和Session专题
- Cookie和Session专题
- Cookie和Session专题
- Cookie和Session专题
- Cookie和Session专题
- Cookie和session
- cookie和session关系
- 【ZOJ 3690】 Choosing number (矩阵快速幂)
- 杭电ACM2016-数据的交换输出
- 调整SQLServer2000运行中数据库结构
- HDU 1003 Max Sum
- MySQL数据导入导出全解
- Session和Cookie
- iOS Swift+Foundation学习笔记
- 学习openstack(一)
- 单链表
- POJ 3579:Median 差值的中位数
- error LNK1281: 无法生成 SAFESEH 映像VS2013常见编译错误解决
- hibernate 的class元素详解
- 实用make最佳实践
- nyoj--1185--最大最小值(线段树)