www.2527.com_澳门新葡8455手机版_新京葡娱乐场网址_
做最好的网站

Cookie机制详解

2019-05-18 21:19 来源:未知

HTTP 协议

Web 浏览器Web 服务器之间的一问一答的交互过程必须遵守一定的规则,这样的规则就是 HTTP 协议。

HTTPhypertext transfer protocol(超文本传输协议)的简写,它是 TCP/IP 协议之上的一个应用层的协议,用于定义 Web 浏览器与 Web 服务器之间交互数据的过程以及数据本身的格式。

  • 特点:无状态,默认端口 80

1)cookie机制的基本原理就如上面的例子一样简单,但是还有几个问题需要解决:“会员卡”如何分发;“会员卡”的内容;以及客户如何使用“会员卡”。

Session 扩展

  • Seesion 中的共享数据的属性名的命名规范:
    通常为:XXX_IN_SESSION,例如:Session对象.setAttribute(“USER_IN_SESSION”,user)
  • 序列化与反序列化:
    Session 中存储的对象通常需要实现序列化接口,因为在网络之间传输的数据格式为二进制数据
    • 序列化:将对象转换成二进制数据
    • 反序列化:将二进制数据转换成对象
  • URL 重写
    出现的问题:
    当浏览器禁用Cookie之后,那么我们的jsessionid就不能在浏览器中保存,那么后面的请求中就不会将 jsessionid 发送到服务器,服务器这面就找不到数据
    解决方案:
    1.在url后手动的拼接上 jsessionid
    传递格式如 /path/Servlet;jsessionid=sessionid
    2.使用响应对象中的encodeURL(String path)实现 jsessionid 的自动拼接
    String path = resp.encodeURL("path/Servlet");
    • 推荐方式:②

欢迎转载,转载请注明出处!
简书ID:@我没有三颗心脏
github:wmyskxz
欢迎关注公众微信号:wmyskxz_javaweb
分享自己的Java Web学习之路以及各种Java学习资料

4、由于B/S计算模型中计算是在服务器端完成的,客户端只有简单的显示逻辑,所以,Session数据对客户端应该是透明的不可理解的并且应该受控于服 务端;Session数据要么保存到服务端(HttpSession),要么在客户端和服务端之间传递(Cookie或url rewritting或Hidden input);

理解 Session

前面已经介绍了 Cookie 可以让服务端程序跟踪每个客户端的访问,但是每次客户端的访问都必须传回这些 Cookie,如果 Cookie 很多,则无形增加了客户端与服务端的数据传输量,而 Session 的出现正是为了解决这个问题。

同一个客户端每次和服务端交互时,不需要每次都传回所有的 Cookie 值,而是只要传回一个 ID,这个 ID 就是客户端第一次访问服务器生成的,而且每个客户端是唯一的。这样每个客户端就有了一个唯一的 ID,客户端只要传回这个 ID 就行了,这个 ID 通常是 NAME 为 JSESIONID 的一个 Cookie。

路径、域和作用范围:其中域可以指定某一个域比如.google.com,相当于总店招牌,比如宝洁公司,也可以指定一个域下的具体某台机器比如www.google.com或者froogle.google.com,可以用飘柔来做比。

HTTP 无状态协议

HTTP 是一个无状态的协议,也就是没有记忆力,这意味着每一次的请求都是独立的,缺少状态意味着如果后续处理需要前面的信息,则它必须要重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就很快。

HTTP 的这种特性有优点也有缺点:

  • 优点:解放了服务器,每一次的请求“点到为止”,不会造成不必要的连接占用。
  • 缺点:每次请求会传输大量重复的内容信息,并且,在请求之间无法实现数据的共享。

二、一般用来实现Session的方法有两种·

Session 技术

Session:会话,从浏览器打开开始,直到浏览器关闭结束,无论在这个网站中访问了多少页面,点击了多少链接,都属于同一个会话。Session 也可以称为会话 Cookie

  • 特点:服务端技术,将数据保存在服务器

图片 1

9、客户端和服务端的session存储在性能、安全性、跨站能力、编程方便性等方面都有一定的区别,而且优劣并非绝对(譬如TheServerSide 号称不使用HttpSession,所以性能好,这很显然:一个具有上亿的访问用户的系统,要在服务端数据库中检索出用户的偏好信息显然是低效 的,Session管理器不管用什么数据结构和算法都要耗费大量内存和CPU时间;而用cookie,则根本不用检索和维护session数据,服务器可 以做成无状态的,当然高效);

Session 基本操作

  1. 获取 Session 对象
    request对象.getSession()
    和参数为true的一样
    request对象.getSession(true)
    获取Session对象,如果没有Session对象,直接创建一个新的返回,缺省值
    request对象.getSession(false)
    获取Session对象,如果没有返回null
  2. 设置共享数据
Session对象.setAttribute(String name, Object value)
  • 注意:Session 可以存储任何类型的数据,比如登陆用户的信息,可以封装到User对象中
  1. 修改共享数据
    重新设置一个同名的共享数据

  2. 获取共享数据

Object value = Session对象.getAttribute(String name);
  1. 删除 Session 中的共享数据
Session对象.removeAttribute(String name);
  1. 销毁 Session
void invalidate() 
  1. Session 的超时管理
  • 超时:在访问当前的资源的过程中,不和网页进行任何的交互,超过设定的时间就是超时
    在 Tomcat 服务器中有默认的配置为30分钟,一般不需要去修改
  • 语法:void setMaxInactiveInterval(int interval)

Request是一个顾客,第一次来到存包处,管理员把顾客的物品存放在某一个柜子里面(这个柜子就相当于Session),然后把一个号码牌交给这个顾

Cookie 的缺陷

Cookie 的作用其实就是一种会话跟踪技术,但存在一些缺陷:

  1. 获取 Cookie 信息比较麻烦
  2. Cookie 不支持中文
  3. 一个 Cookie 只能存储一个字符串类型的数据
  4. Cookie 在浏览器中有大小和数量上的限制(不同浏览器存在不同的限制,例如FireFox一个站点最多存储50个 Cookie ,浏览器最多存储 4097个字大小的 Cookie)
  5. 共享数据时保存在浏览器中,容易造成数据的泄露,不安全
  • 最好的解决方案:将数据保存在服务端(session)

浏览器差异:存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式。对于IE,在一个打开的窗口上按Ctrl-N(或者从文件菜单)打开的窗口可以与原窗口共享,而使用其他方式新开的IE进程则不能共享已经打开的窗口的内存cookie;对于Mozilla Firefox0.8,所有的进程和标签页都可以共享同样的cookie。一般来说是用javascript的window.open打开的窗口会与原窗口共享内存cookie。浏览器对于会话cookie的这种只认cookie不认人的处理方式经常给采用session机制的web应用程序开发者造成很大的困扰。

Cookie 技术

  • 特点:客户端的技术,将共享数据保存在客户端(浏览器)中

英文直接翻译过来就是小甜品,Cookie 的作用呢,通俗的说就是当一个用户通过 HTTP 访问一个服务器时,这个服务器会将一些 Key/Value 键值对返回给客户端浏览器,并给这些数据加上一些限制条件,在条件符合时这个用户下次访问这个服务器时,数据又被完整地带回给服务器。

这个作用就像是你去超市购物时,第一次给你办了一张购物卡,在这个购物卡里存放了一些你的个人信息,下次你再来这个超市的时候,你就只需要带上你的购物卡,直接购物就好了。

图片 2

5、由于HTTP本身的无状态性,服务端无法知道客户端相继发来的请求是来自一个客户的,所以,当使用服务端HttpSession存储会话数据的时候客户端的每个请求都应该包含一个session的标识(sid, jsessionid 等等)来告诉服务端;

Cookie 操作

  1. 创建 Cookie 对象,设置共享数据
Cookie c = new Cookie(String name,String value);  // 相当于办卡
  • 注意:一个Cookie只能存储一个字符串类型的数据,不能存储其他类型的数据
  1. 将 Cookie 响应给浏览器
response对象.addCookie(cookie对象)                // 相当于把卡交给用户
  1. 获取请求中的 Cookie 信息
Cookie[] cs = request对象.getCookies();
for(Cookie c : cs){
    if(“username”.equals(c.getName())){
        String value = c.getValue();
    }
}
  1. 修改 Cookie 中的共享数据
    1.重新创建一个新的 Cookie,名称要和要修改的数据一致
    2.现获取到要修改的 Cookie 对象,再调用 setValue(String newValue) 重新设置
  • 注意:修改 Cookie 中的数据,需要再次发送给浏览器(第2点)
  1. 操作 Cookie 的生命周期
  • 默认:在关闭浏览器的时候销毁 Cookie 对象
  • 语法:void setMaxAge(int expiry)
    expiry > 0:设置 Cookie 对象能够存活 expiry 秒,即使关闭浏览器,也不影响 Cookie 中的共享数据,比如设置一个月:setMaxAge(60*60*24*30);
    expiry = 0:立即删除当前的 Cookie 信息
    expiry < 0:关闭浏览器时销毁
  1. 删除 Cookie 中的共享数据
    通过setMaxAge(0)来实现

  2. Cookie 中的 key 和 value 不支持中文
    设置 Cookie 时需要对中文字符串进行编码:
    java Cookie c = new Cookie("username", URLEncoder.encode(username,"UTF-8"));
    在获取 Cookie 数据的时候再进行解码:
    java username = URLDecoder.decode(value, "UTF-8");

  3. Cookie 的路径和域范围
  • Cookie 的路径
    Cookie 在创建的时候,会根据当前的Servlet的相对路径来设置自己的路径,比如 Servlet 的url-pattern/cookie/login,相对路径则为:/cookie/
    • 出现的问题:
      只有在访问路径为 /cookie/ 下面的资源的时候,才会将该 Cookie 发送到服务器
    • 解决方案:
      设置 Cookie 的路径:void setPath(String uri)
      Cookie对象.setPath("/"); 表示当前应用中的所有的资源都能够共享该Cookie信息
  • 域范围:(了解)
    在多个应用之间实现数据的共享,那么就需要设置域范围,比如:
    www.baidu.com / news.baidu.com / map.baidu.com
  • 语法:Cookie对象.setDomain("baidu.com");

对所有的URL使用URL重写,包括超链接,form的action,和重定向的URL

HTTP 协议到底约束了什么?

  1. 约束了浏览器以何种格式向服务端发送数据
  2. 约束了服务器应该以何种格式接收客户端发送的数据
  3. 约束了服务器应该以何种格式反馈数据给浏览器
  4. 约束了浏览器应该以何种格式接收服务器的反馈数据
  • 总结:
    浏览器给服务器发送数据:一次请求
    服务器给浏览器反馈数据:一次响应

b.距离上一次收到客户端发送的session id时间间隔超过了session的超时设置;

主要问题:请求之间无法实现数据的共享

  • 解决方案:
    1.使用参数传递机制:
    将参数拼接在请求的 URL 后面,实现数据的传递(GET方式),例如:/param/list?username=wmyskxz
    问题:可以解决数据共享的问题,但是这种方式一不安全,二数据允许传输量只有1kb
    2.使用Cookie技术
    3.使用Session技术

10、所谓的“会话cookie”简单的说就是没有明确指明有效期的cookie,仅在浏览器当前进程生命期内有效,可以被后继的Set-Cookie操作清除掉。

图片 3

- 称为 session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session

下一次,用户访问这个页面中的URL。jsessionid就会传回到Web Server。

1、存放在session中的对象必须是可序列化的吗?

如何做到在浏览器关闭的时候删除cookie?

Request)下次来的时候,就又带着号码牌回来了。

客户端会把Cookie存放在本地文件里,下一次访问Web Server的时候,再把Cookie的信息放到HTTP Request的“Cookie”header属性里面,这样jsessionid就随着HTTP Request返回给Web Server。

2 )这个用户随后的所有请求都应包括这个标识号。服务器会校对这个标识号以判断请求属于哪个session。

3、所谓Session,指的是客户端和服务端之间的一段交互过程的状态信息(数据);这个状态如何界定,生命期有多长,这是应用本身的事情;

不是必需的。要求对象可序列化只是为了session能够在集群中被复制或者能够持久保存或者在必要时server能够暂时把session交换出内存。

如果客户端支持Cookie,Web Server在返回Response的时候,在Response的Header部分,加入一个“set-cookie: jsessionid=XXXX”header属性,把jsessionid放在Cookie里传到客户端。

8、使用服务端还是客户端session存储要看应用的实际情况的。一般来说不要求用户注册登录的公共服务系统(如google)采用cookie做客户 端session存储(如google的用户偏好设置),而有用户管理的系统则使用服务端存储。原因很显然:无需用户登录的系统唯一能够标识用户的就是用 户的电脑,换一台机器就不知道谁是谁了,服务端session存储根本不管用;而有用户管理的系统则可以通过用户id来管理用户个人数据,从而提供任意复 杂的个性化服务;

五、Session何时被创建、何时被删除

我们可以看到,Session ID实际上是在客户端和服务端之间通过HTTP Request和HTTP Response传来传去的。

1)URL重写。

ID)交给存包处(Web Server)的管理员。管理员根据号码牌(Session ID)找到相应的柜子(Session),根据顾客(HTTP

HTTP协议本身是无状态的,本身并不能支持服务端保存客户端的状态信息,于是,Web Server中引入了session的概念,用来保存客户端的状态信息。

id把这个 session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session

2、Cookie规范是为了给HTTP增加状态跟踪用的(如果要精确把握,建议仔细阅读一下相关的RFC),但不是唯一的手段;

a.程序调用HttpSession.invalidate();

7、客户端Session存储只有一个办法:cookie(url rewritting和hidden input因为无法做到持久化,不算,只能作为交换session id的方式,即a method of session tracking),而服务端做法大致也是一个道理:容器有个session管理器(如tomcat的 org.apache.catalina.session包里面的类),提供session的生命周期和持久化管理并提供访问session数据的 api;

何时删除:

路径就是跟在域名后面的URL路径,比如/或者/foo等等,可以用某飘柔专柜做比。

六、Session的其他问题

id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个 session id将被在本次响应中返回给客户端保存。

三、session的工作原理

这里用一个形象的比喻来解释session的工作方式。假设Web

1、HTTP协议本身是“连接-请求-应答-关闭连接”模式的,是一种无状态协议(HTTP只是一个传输协议);

七、理解Cookie机制

保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID.

四、HttpSession总结

八、cookie的内容

c.服务器进程被停止(非持久session)

Request)的号码牌和号码牌对应的柜子(Session)失效。顾客(HTTP Request)的忘性很大,管理员在顾客回去的时候(HTTP

路径与域合在一起就构成了cookie的作用范围。

主要包括:名字,值,过期时间,路径和域。

2)正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的cookie。然而纯粹的客户端脚本如JavaScript或者VBScript也可以生成cookie。

Server是一个商场的存包处,HTTP

3)而cookie的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。意思是麦当劳的会员卡只能在麦当劳的店里出示,如果某家分店还发行了自己的会员卡,那么进这家店的时候除了要出示麦当劳的会员卡,还要出示这家店的会员卡。

当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识

id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session

客,作为取包凭证(这个号码牌就是Session ID)。顾客(HTTP Request)下一次来的时候,就要把号码牌(Session

6、会话数据保存在服务端(如HttpSession)的好处是减少了HTTP请求的长度,提高了网络传输效率;客户端session信息存储则相反;

对于session标识号(sessionID),有两种方式实现:cookies和URL重写。

何时创建:一个常见的误解是以为session在有客户端访问时就被创建,然而事实是直到某server端程序调用 HttpServletRequest.getSession(true)这样的语句时才被创建,注意如果JSP没有显示的使用 <% @page session="false"%> 关闭session,则JSP文件在编译成Servlet时将会自动加上这样一条语句 HttpSession session = HttpServletRequest.getSession(true);这也是JSP中隐含的 session对象的来历。由于session会消耗内存资源,因此,如果不打算使用session,应该在所有的JSP中关闭它。

2、如何才能正确的应付客户端禁止cookie的可能性

Request)的请求,Web Server可以取出、更换、添加柜子(Session)中的物品,Web Server也可以让顾客(HTTP

2)Cookie。

这种机制不使用IP作为标识,是因为很多机器是通过代理服务器方式上网,没法区分每一台机器。

一、什么是http session,有什么用

严格的讲,做不到这一点。可以做一点努力的办法是在所有的客户端页面里使用javascript代码window.oncolose来监视浏览器的关闭动作,然后向服务器发送一个请求来删除session。但是对于浏览器崩溃或者强行杀死进程这些非常规手段仍然无能为力。

过期时间:如果不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。

Web Server在返回Response的时候,检查页面中所有的URL,包括所有的连接,和HTML Form的Action属性,在这些URL后面加上“;jsessionid=XXX”。

1)当一个用户向服务器发送第一个请求时,服务器为其建立一个session,并为此session创建一个标识号;

Response)都要重新提醒顾客记住自己的号码牌(Session ID)。这样,顾客(HTTP

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

TAG标签:
版权声明:本文由澳门新葡8455手机版发布于计算机编程,转载请注明出处:Cookie机制详解