栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

详解Cookie及Session

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

详解Cookie及Session

引入 什么是会话

会话就是日常生活中非常常见的一种现象,当你拿起电话和朋友谈笑风生直到挂断电话就是一次会话,而在Web应用中的会话过程也类似与日常生活中的会话,它指浏览器和服务器之间连续发生的一系列请求和响应过程(注意是连续发生的,比如你在网上购物的整个过程就是一个会话)。会话过程中会产生一系列的数据,比如通话会有通话内容,而客户端与服务器交互时同样会产生数据。

为什么需要会话技术

上面说到会话中会产生数据,而这些数据往往需要服务器进行保存,比如在购物过程中,你将商品加入购物车,然后付款,服务器需要将你的信息进行保存。说到保存,可以想到使用HttpServletRequest和ServletContext这两个对象,但是这种情况不能使用这两个对象来保存,原因如下:

  1. http请求是无状态的,因此每次请求都是一个新的请求,每次请求服务器都会为它创建一个HttpServletRequest对象,该对象只能保存本次请求的数据,因为付款和加购往往是两次请求,因此当你付款时是无法从HttpServletRequest对象中获得数据的。
  2. ServletContext对象是一个全局对象,它代表整个Web容器,因此整个Web应用共享同一个该对象,所以当有多个用户在加购付款,服务器是没办法区分哪些商品是哪些用户的

因此为了保存会话数据,就提供了cookie和Session两个对象。

会话技术

会话技术分为客户端会话技术和服务端会话技术。

cookie

cookie是客户端的会话技术,它将会话过程中的数据保存在用户的浏览器里面。
就比如日常生活中的会员卡,假如当你购物时,商家给你一张积分会员卡,卡上记录者你的信息,当你下次带上会员卡去购物时就能享受对应的优惠了,cookie的作用就类似于会员卡,用户访问服务器时服务器会给用户发送一些数据,这些数据就保存在cookie中,以后用户再次访问服务器时就会自动带上cookie。


使用步骤:

  1. 创建cookie对象, 绑定数据
    new cookie(String name, String value)
  2. 发送cookie对象
    response.addcookie(cookie cookie)
  3. 获取cookie,拿到数据
    cookie[] request. getcookies()

默认情况下cookie在浏览器中保存的时间是有限的,当关闭浏览器时cookie就会被删除,因此为了能让它保存的时间更长,我们往往需要设置过期时间:

cookie.setMaxAge(int expriy)//参数为秒数

当然cookie对象还有很多方法,常用的有:

方法名作用
String getName()返回cookie的名称
void setValue()为cookie设置一个值
String getValue()返回cookie值
int getMaxAge()返回cookie在浏览器客户端上保持的有效秒数
void setPath()设置该cookie的有效目录路径
void setDomain()设置cookie的有效域

一些细节:

  • cookie在浏览器中保存多长时间?
  1. 默认情况下,当浏览器关闭后,cookie数据被销毁
  2. 持久化存储:setMaxAge(int explry)
  • cookie能不能存中文?
    在tomcat 8之前cookie中不能直接存储中文数据。
    需要将中文数据转码一般采用URL编码(%E3)(URLEncoder类)
    在tomcat 8之后,cookie支持中文数据。但仍然不支持特殊字符

  • cookie共享问题?
    假设在一个tomcat服务器中,部署了多个web项目,那么在这些web项目中cookie能不能共享?
    默认情况下cookie不能共享
    setPath(string path) :设置cookie的获取范围。默认付况下,设置当前的虚拟目录如果要共享,则可以将path设置为"/"

  • 不同的tomcat服务器间cookie共享问题?
    setDomain(string path): 如果设置一级域名相同,那么多个服务器之间cookie可以共享setDomain(" .baidu. com") ,那么tieba . baidu. com和news . baidu. com中cookie可共享

Session

cookie可以将用户信息保存在浏览器中 ,并且可以在多次请求下实现数据共享。但是当传递的信息比较多,使用cookie技术显然会增大服务器程序的处理难度,所有就出现了Session技术。Session将会话产生的数据保存到服务器里面。
使用步骤

  1. 获取HttpSession对象 :
    Httpsession session = request.getsession()
  2. 使用HttpSession对象 :
    向session里面存东西:void setAttribute(string name, object value)
    从session里面获取东西:object getAttribute(string name)
    删除session里面的数据:void removetAtribute(string name)

原理:
当客户端第一次向服务器发起请求时,服务器会为它创建一个session对象,然后把这个session对象的ID值以存到客户端的cookie中(JSESSIonID=xxxxxxx),当客户端下次请求服务器时,它会自动带上cookie,服务器就会读取cookie中的session ID,如果有,就会根据该ID找到之前Session对象,如果没有就会重新获取一个Session对象。就好比上面的购物案例一样,当商家给你会员卡的同时他也会在自己的电脑上记录你的会员信息,而会员卡上面往往会有个卡号,这个卡号就相当于Session ID,当你拿着会员卡去购物时商家就会根据卡号查询你的会员信息。

需要注意的是,这里Seesion的实现需要借助于cookie,如果客户端将cookie禁用之后就无法使用了。好比商家给你会员卡,然后你把会员卡扔了一样。

上面说cookie的作用时间是有限的,同样Session的作用时间也是有限的,cookie默认情况是关闭浏览器就失效,而Session是存在服务端的,而服务器往往是不会关机的,如果不设置过期时间,当用户过多时必然让服务器内存爆满。让Session失效的方式有两种:

1. 自生自灭(不同服务器有不同的失效时间,tomcat默认为30min,也可以自己配置)
2. 调用invalidate()方法

常用方法:

方法名作用
String getId()返回Session的ID值
void invalidate()强制失效
void getServletContext()获取ServletContext对象
void setAttribute(String name,Object Value)向session中添加值(键值对形式)
void getAttribute(String name)根据名称获取值
void removetAtribute(string name)删除值

一些细节

  • 当客户端关闭后,服务器不关闭,两次获取session是否为同一 个?
    事默认情况下不是。(因为这个存有JSESSIONID的cookie是服务器自动生成的)
    如果需要相同,则可以创建cookie,键为JSESSIONID,设置最大存活时间.
    之后客户端再次访问服务端时就会将该cookie携带上,服务端通过

  • 客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
    不是同一个,但是要确保数据不丢失
    session的钝化:
    在服务器正常关闭之前,将session对象系列化到硬盘上
    session的活化:
    在服务器启动后,将session文件转化为内存中的session对实即可。

  • session依赖于cookie实现,当cookie被禁用后可以通过URL重写来将JSESSIONID以URL参数形式传输

cookie和Session的区别
  1. session存储数据在服务器端,cookie在客户端
  2. session没有数据大小限制,而且能存储复制类型数据, cookie有大小限制。
  3. session数据安全, cookie相对于不安全
  4. Session是服务器自动建立的,用getSession就可以获得,cookie需要自己new
应用
  1. 显示上次访问时间
  2. 登录认证

每个客户端请求都会和服务器建立一个会话,会有一个唯一的SessionId,
客户端在收到SessionId之后可以将seesionId保存(比如保存在cookie中),然后每次通过cookie的sessionId去验证。

  1. 。。。。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/604245.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号