您的位置:首页 > 其它

深入理解cookie与session

2016-02-19 14:34 686 查看
转自:http://blog.csdn.net/j903829182/article/details/39855221

cookie和session是web开发比较基础也比较重要的知识,cookie和session用于用户的状态管理。简单的来说它们都只是http中的一个配置项,在Servlet规范中也只对应一个类而已;http对cookie的数量和大小有限制,而session不易于在很多的服务器中进行共享。

Session与Cookie的作用都是为了保持访问用户与后端服务器的交互状态。他们有各自的优点和缺陷。但一个服务器访问量很大的时候,比如一天又几亿个pv,假如每个cookie占用200个字节,那么它需要多少带宽了。所以访问量大的时候希望使用session,但是session的致命弱点是不容易在多台服务器之间共享,这也限制了session的使用。

















以上的这些资料来自阿里的java web技术内幕

为了解决cookie和session的缺陷,并结合他们的优势,利用session的分布式框架,可以节省带宽,和解决session的同步问题,具体的可以参考阿里内部技术资料java web技术内幕。

1.状态管理

服务器对用户访问的状态进行管理

http请求是一次性请求,但同一用户可能会通过http协议向服务器发送多次请求

用了管理用户多次请求(登录开始到退出为止,中间多次请求操作为同一用户),此时

需要对用户进行状态管理

状体管理的两种方式:

1.在客户端保存数据管理状态(cookie)

2.在服务器端保存数据管理状态(session)

2.session

用户首次访问服务器,服务器会为每个用户单独创建一个session对象(HttpSession),

并为每个session分配唯一一个id(sessionId),sessionId通过cookie保存到用户端,

。当用户再次访问服务器时,需将对应的sessionId携带给服务器,服务器通过这个唯一

sessionId就可以找到用户对应的session对象,从而达到管理用户状态

1.获得session对象

a.request.getSession(flag);

当flag=true时,服务器会查找用户是否用sessionId,如果sessionId为Null,

则服务器会创建一个新的session对象返回给用户(sessionId)

如果sessionId存在,则会根据对应的sessionId去查找session对象,如果session

对象存在则直接返回,如果不存在则创建新的session对象并返回。

当flag=false;服务器会查找用户是否用sessionId,如果sessionId为Null,则返回

为null,如果sessionId,则会根据对应的sessionId去查找session对象,如果session

对象存在则直接返回,如果不存在则返回为Null。

b.request.getSession();

等效于request.getSession(true);

2.session常用API

存:session.setAttribute(key,value);

取:session.getAttribute(key);

删除:session.removeAttribute(key);

-------------------------------------------------------

1.状态管理

前提:http协议请求是一次性请求。但在通常情况下又需要记住用户,管理用户状态

2.状态管理方式方法

1.客户端保存数据(Cookie)

2.服务器端(Session)

3.session

因为用户首次访问,服务器会检查sessionId没有则创建session对象,并将对象的sessionId

发送给用户(response对象,以cookie方式),当用户再次访问,需要携带对应的sessionId

(request对象,以cookide方式),服务器会检查对应sessionId,存在则查找对应的session对象

并返回给用户。如果sessionId存在而对应session对象不存在,服务器会创建新的session对象并

将这个新得到sessionId返回给用户。

4.session的API

a.HttpSession session=request.getSession(true/false);

b.HttpSession session=request.getSession();

public static HttpSession getSession(){

return getSession(true);

}

//重载的方法之间经常重用

例如:点与圆之间的距离

class Circle{

double getDistance(int x,int y){

return Math.sqrt((this.x-x)(this.x-x)-(this.y-y)(this.y-y));

}

double getDistance(Point p){

return getDistance(p.getX(),p.getY());

}

}

c.session.setAttribute(key,value);

d.session.getAttribute(key);-value(Object)

e.session.removeAttribute(key);

f.session.getSessionId();

【练习】使用session记录用户的访问次数

5.session的有效期

所有用户的session对象都保存在服务器,则服务器空间有限,所有不能永久保存session

即sesion对象在服务器中保存的有效时间

设置session有效期:

1.//设置session有效期

session.setMaxInactiveInterval(15);

2.服务器设置

<session-config>

<session-timeout>30</session-timeout>

</session-config>

3.在servlet对应的web.xml中配置

6.踢出session

session.invalidate();

7.Session失效

禁用cookie会导致session失效

原理:客户端无法保存服务器发送的sessionId,所以访问时没有sessionId,那么根据

session创建原理,服务器会创建新的session对象返回给用户

解决方式:URL重写

原文:http://blog.csdn.net/j903829182/article/details/39855221
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: