cookie和session常见问题

1、cookie和session原理及区别  

cookie采用的是客户端的会话状态的一种储存机制。

session是一种服务器端的信息管理机制,它把这些文件信息以文件的形式存放在服务器的硬盘空间上
(这是默认情况,可以用memcache把这种数据放到内存里面)

区别:Cookie保存在客户端浏览器中,而Session保存在服务器上。


2、  session产生的session_id放在cookie里面,如果用户把cookie禁止掉,是不是session也不能用了呢?
禁止掉cookie后,session当然可以用,不过通过其他的方式来获得这个sessionid,比如,可以跟在url的
后面,或者以表单的形势提交到服务器端。从而使服务器端了解客户端的状态。

3、  为什么说session 比cookie更安全?
1.sessionID是加密的,第二次session_start的时候,前一次的sessionID就没有用了,session过期
时sessionid也会失效,
2.想在短时间内功破加了密的 sessionID很难。session是针对某一次通信而言,会话结束session也就随着
消失了。

使session失效的方法:
1.关闭tomcat  2.重启web应用  3.session时间到  4.无效的session

cookie和session的区别:

①存在的位置:
cookie 存在于客户端,临时文件夹中;  session存在于服务器的内存中,一个session域对象为一个用户
浏览器服务

②安全性
cookie是以明文的方式存放在客户端的,安全性低,可以通过一个加密算法进行加密后存放;  session存放于
服务器的内存中,所以安全性好

③网络传输量
cookie会传递消息给服务器;  session本身存放于服务器,不会有传送流量

④生命周期(以20分钟为例)
cookie的生命周期是累计的,从创建时,就开始计时,20分钟后,cookie生命周期结束;session的生命
周期是间隔的,从创建时,开始计时如在20分钟,没有访问session,那么session生命周期被销毁。但是,
如果在20分钟内(如在第19分钟时)访问过session,那么,将重新计算session的生命周期。关机会造成
session生命周期的结束,但是对cookie没有影响

⑤访问范围
cookie为多个用户浏览器共享;  session为一个用户浏览器独享

session和cookie的区别

Cookie

用来存储用户缓存数据,存储在浏览器中,关闭浏览器还会保存在浏览器.一般Cookie失效是因为,开发者设置的
时间期限已到.而且他可以由用户任意修改,不安全.且Cookie存储的数据为简单类型数据.

Session

跟Cookie一样也是用来存储用户数据,区别在于Session存储的缓存数据在服务器中,保存在浏览器的只是
用户访问服务器缓存的钥匙(session_id).

而且Session可以存储复杂数据类型.Session会在用户关闭浏览器的时候清除失效,总而言之Session相对
于Cookie来说较安全.但没有绝对的安全

1、cookie数据存放在客户的浏览器上,session数据放在服务器上。

2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。

3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器
性能方面,应当使用cookie。

4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

5、可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。

一、cookie机制和session机制的区别
1.cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。
2.服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到
保存标识的目的,但实际上还有其他选择

二、会话cookie和持久cookie的区别
1.如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就
消失了。这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存
在内存里。
2.如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效
直到超过设定的过期时间。
3.存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存的cookie,
不同的浏览器有不同的处理方式。

三、如何利用实现自动登录
当用户在某个网站注册后,就会收到一个惟一用户ID的cookie。客户后来重新连接时,这个用户ID会自动
返回,服务器对它进行检查,确定它是否为注册用户且选择了自动登录,从而使用户务需给出明确的用户名
和密码,就可以访问服务器上的资源。

四、cookie的发送
1.创建Cookie对象
2.设置最大时效
3.将Cookie放入到HTTP响应报头
4.如果你创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie,存储在浏览器
的内存中,用户退出浏览器之后被删除。
5.如果你希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大
时效设为0则是命令浏览器删除该cookie。

五、cookie的读取
1.要获取有浏览器发送来的cookie,需要调用HttpServletRequest的getCookies方法,这个调用
返回Cookie对象的数组,对应由HTTP请求中Cookie报头输入的值。
2.对数组进行循环,调用每个cookie的getName方法,直到找到感兴趣的cookie为止
3.cookie与你的主机(域)相关,而非你的servlet或JSP页面。因而,尽管你的servlet可能只发送了
单个cookie,你也可能会得到许多不相关的cookie。

  String cookieName = “userID”;

     Cookie cookies[] = request.getCookies();

     if (cookies!=null){

         for(int i=0;i<cookies.length;i++){

     Cookie cookie = cookies[i];

     if (cookieName.equals(cookie.getName())){

         doSomethingWith(cookie.getValue());

}

}

}

六、保存session id的几种方式
A.保存session id的方式可以采用cookie
B.由于cookie可以被人为的禁止,必须有其它的机制以便在cookie被禁止时仍然能够把session id传递
回服务器,经常采用的一种技术叫做URL重写,就是把session id附加在URL路径的后面

八、session什么时候被创建
一个常见的错误是以为session在有客户端访问时就被创建,然而事实是直到某server端程序(如Servlet)
调用HttpServletRequest.getSession(true)这样的语句时才会被创建。

session在下列情况下被删除:
A.程序调用HttpSession.invalidate()
B.距离上一次收到客户端发送的session id时间间隔超过了session的最大有效时间
C.服务器进程被停止
再次注意关闭浏览器只会使存储在客户端浏览器内存中的session cookie失效,不会使服务器端的session
对象失效。

九、getSession()/getSession(true)、getSession(false)的区别
1.getSession()/getSession(true):当session存在时返回该session,否则新建一个session并返回
该对象
2.getSession(false):当session存在时返回该session,否则不会新建session,返回null

十、会话属性的类型有什么限制吗
1.通常会话属性的类型只要是Object就可以了。除了null或基本类型,如int,double,boolean。
2.如果要使用基本类型的值作为属性,必须将其转换为相应的封装类对象

十一、如何废弃会话数据
A.只移除自己编写的servlet创建的数据:调用removeAttribute(“key”)将指定键关联的值废弃
B.删除整个会话(在当前Web应用中):调用invalidate,将整个会话废弃掉。这样做会丢失该用户的所有
会话数据,而非仅仅由我们servlet或JSP页面创建的会话数据

十二、session cookie和session对象的生命周期是一样的吗
当用户关闭了浏览器虽然session cookie已经消失,但session对象仍然保存在服务器端

十四、是否只要关闭浏览器,session就消失了

1.浏览器从来不会主动在关闭之前通知服务器它将要被关闭,因此服务器根本不会有机会知道浏览器已经
关闭。是因为大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个session id
就消失了,再次连接到服务器时也就无法找到原来的session。

2.恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为session设置了一个失效时间,当距离客户
上一次使用session的时间超过了这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把
session删除以节省存储空间。

3.关闭浏览器,只会是浏览器端内存里的session cookie消失,但不会使保存在服务器端的session对象
消失,同样也不会使已经保存到硬盘上的持久化cookie消失。

十四、打开两个浏览器窗口访问应用程序会使用同一个session还是不同的session

1.通常session cookie是不能跨窗口使用的,当你新开了一个浏览器窗口进入相同页面时,系统会赋予你
一个新的session id,这样我们信息共享的目的就达不到了。

2.我们可以先把session id保存在persistent cookie中(通过设置session的最大有效时间),然后在
新窗口中读出来,就可以得到上一个窗口的session id了,这样通过session cookie和persistent 
cookie的结合我们就可以实现了跨窗口的会话跟踪。

HttpSession session = request.getSession();

SomeImmutalbeClass value = (SomeImmutableClass)session.getAttribute(“SomeIdentifier”);

if (value==null){

     value = new SomeImmutableClass(…); // 新创建一个不可更改对象

}else{

     value = new SomeImmutableClass(calculatedFrom(value)); // 对value重新计算后创建新的对象

}

session.setAttribute(“someIdentifier”,value); // 使用新创建的对象覆盖原来的老的对象

十五、如何使用会话累计用户的数据

使用可变的数据结构,比如数组、List、Map或含有可写字段的应用程序专有的数据结构。

HttpSession session = request.getSession();

SomeMutableClass value = (SomeMutableClass)session.getAttribute(“someIdentifier”);

if(value = = null){

     value = new SomeMutableClass(…);

     session.setAttribute(“someIdentifier”,value);

}else{

     value.updateInternalAttribute(…);      // 如果已经存在该对象则更新其属性而不需重新设置
属性

}

Cookie与session的区别及其常见问题

1.服务器端向客户端发送一个Cookie

1)创建Cookie:
Cookie cookie = new Cookie(String cookieName,String cookieValue);
Cookie cookie = new Cookie("username","zhangsan");

那么该cookie会以响应头的形式发送给客户端:注意:Cookie中不能存储中文

2)设置Cookie在客户端的持久化时间:
cookie.setMaxAge(int seconds); ---时间秒

 注意:如果不设置持久化时间,cookie会存储在浏览器的内存中,浏览器关闭cookie信息销毁(会话级别
的cookie),如果设置持久化时间,cookie信息会被持久化到浏览器的磁盘文件里

cookie.setMaxAge(10*60);
设置cookie信息在浏览器的磁盘文件中存储的时间是10分钟,过期浏览器	自动删除该cookie信息

 3)设置Cookie的携带路径:
注意:如果不设置携带路径,那么该cookie信息会在访问产生该cookie的web资源所在的路径都携带cookie
信息

cookie.setPath("/WEB16");
 代表访问WEB16应用中的任何资源都携带cookie
cookie.setPath("/WEB16/cookieServlet");

4)向客户端发送cookie:
  response.addCookie(Cookie cookie);

5)删除客户端的cookie:
 如果想删除客户端的已经存储的cookie信息,那么就使用同名同路径的持久化时间为0的cookie进行覆盖即可

2.服务器端怎么接受客户端携带的Cookie

cookie信息是以请求头的方式发送到服务器端的:

 1)通过request获得所有的Cookie:
Cookie[] cookies = request.getCookies();

2)遍历Cookie数组,通过Cookie的名称获得我们想要的Cookie

for(Cookie cookie : cookies){

         if(cookie.getName().equal(cookieName)){

          String cookieValue = cookie.getValue();

      }

}

二、Session技术

Session技术是将数据存储在服务器端的技术,会为每个客户端都创建一块内存空间存储客户的数据,但
客户端需要每次都携带一个标识ID去服务器中寻找属于自己的内存空间。

Session的实现是基于Cookie,Session需要借助于Cookie存储客	户的唯一性标识JSESSIONID

1.获得Session对象
HttpSession session = request.getSession();

此方法会获得专属于当前会话的Session对象,如果服务器端没有该会话的Session对象会创建一个新
的Session返回,如果已经有了属于该会话的Session直接将已有的Session返回(实质就是
根据JSESSIONID判断该客户端是否在服务器上已经存在session了)

2.怎样向session中存取数据(session也是一个域对象)
Session也是存储数据的区域对象,所以session对象也具有如下三个方法:
session.setAttribute(String name,Object obj);
session.getAttribute(String name);
session.removeAttribute(String name);

3.Session对象的生命周期

创建:第一次执行request.getSession()时创建

销毁:
 1)服务器(非正常)关闭时
 2)session过期/失效(默认30分钟)

问题:时间的起算点 从何时开始计算30分钟?
从不操作服务器端的资源开始计时(例如:当你访问淘宝页面时,点开页面不动,第29分钟再动一下页面,
就得重新计时30分钟;当过了30分钟,就失效了。)

可以在工程的web.xml中进行配置
<session-config>
     <session-timeout>30</session-timeout>
</session-config>

 3)手动销毁session
session.invalidate(); 

作用范围:
默认在一次会话中,也就是说在,一次会话中任何资源共用一个session对象

浏览器关闭,session就销毁了? 
 不对,浏览器关闭和服务器session销毁没有任何关系!

会话技术:
 Cookie技术:存到客户端

发送cookie
Cookie cookie = new Cookie(name,value)
cookie.setMaxAge(秒)
cookie.setPath()
response.addCookie(cookie)

获得cookie
Cookie[] cookies = request.getCookies();
cookie.getName();
cookie.getValue();

Session技术:存到服务器端 借助cookie存储JSESSIONID
HttpSession session = request.getSession();
setAttribute(name,value);
getAttribute(name);

session生命周期
创建:第一次指定request.getSession();
销毁:服务器关闭、session失效/过期、手动session.invalidate();

session作用范围:默认一会话中

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值