Cookie

Cookie简介

  • HTTP是无状态协议,服务器不能记录浏览器的访问状态,也就是说服务器不能区分中两次请求是否由一个客户端发出。这样的设计严重阻碍的Web程序的设计。如:在我们进行网购时,买了一条裤子,又买了一个手机。由于http协议是无状态的,如果不通过其他手段,服务器是不能知道用户到底买了什么。而Cookie就是解决方案之一。
  • Cookie实际上就是服务器保存在浏览器上的一段信息。浏览器有了Cookie之后,每次向服务器发送请求时都会同时将该信息发送给服务器,服务器收到请求后,就可以根据该信息处理请求。
  • 例如:我们上文说的网上商城,当用户向购物车中添加一个商品时,服务器会将这个条信息封装成一个Cookie发送给浏览器,浏览器收到Cookie,会将它保存在内存中(注意这里的内存是本机内存,而不是服务器内存),那之后每次向服务器发送请求,浏览器都会携带该Cookie,而服务器就可以通过读取Cookie来判断用户到底买了哪些商品。当用户进行结账操作时,服务器就可以根据Cookie的信息来做结算。
  • 形象介绍:

- 我们想可以通过服务器向浏览器发送一个类似票的东西,浏览器在访问服务器时就可以拿着票来访问服务器就可以根据这个票来识别不同的用户。

- 服务器发送给浏览器的这张票我们称为Cookie。

- Cookie的使用流程:

1.服务器先要创建Cookie

2.将Cookie发送给浏览器

3.浏览器带着Cookie访问服务器

4.服务器检查浏览器的Cookie

- Cookie实际上就是一个头

服务器通过响应头将Cookie发送给浏览器,浏览器通过请求头将Cookie发回给服务器,服务器可以根据不同的Cookie来识别不同的用户。

  • Cookie的用途:
  1. 网上商城的购物车
  2. 保持用户登录状态
  3. 可以用来记录用户上次输入的用户名
  4. 广告的推送
  • Cookie的原理:

n 总的来看Cookie像是服务器发给浏览器的一张“会员卡”,浏览器每次向服务器发送请求时都会带着这张“会员卡”,当服务器看到这张“会员卡”时就可以识别浏览器的身份。

n 实际上这个所谓的“会员卡”就是服务器发送的一个响应头:

如图Set-Cookie这个响应头就是服务器在向服务器发“会员卡”,这个响应头的名字是Set-Cookie,后边JSESSIONID=95A92EC1D7CCB4ADFC24584CB316382E和 Path=/Test_cookie,是两组键值对的结构就是服务器为这个“会员卡”设置的信息。浏览器收到该信息后就会将它保存到内存或硬盘中。

n 当浏览器再次向服务器发送请求时就会携带这个Cookie信息:

这是浏览器发送的请求报文,中间画红框的就是Cookie信息,这里可以理解为浏览器这次带着“会员卡”再次访问服务器。

n 于是服务器就可以根据Cookie信息来判断浏览器的状态。

l Cookie的缺点

n Cookie最为请求或响应报文发送,无形中增加了网络流量。

n Cookie是明文传送的安全性差。

n 各个浏览器对Cookie有限制,使用上有局限

使用Cookie

l 使用Cookie主要是先创建Cookie对象,然后将Cookie信息发送给浏览器,浏览器收到Cookie后会自动保存,然后我们可以在下次浏览器发送请求时读取Cookie信息。

设置Cookie

l 创建一个CookieServlet

l 在Servlet的doPost()方法中编写如下代码:

//创建一个Cookie对象

Cookie cookie = new Cookie("username", "zhangsan");

//将Cookie对象放入response对象中

response.addCookie(cookie);

l 在浏览器中访问该Servlet,会发现响应头中出现如下内容:

Set-Cookie: username=zhangsan

l 如此就成功的向浏览器设置了一个Cookie,当我们在刷新页面时会发现浏览器的请求头中出现如下代码:

Cookie: username=zhangsan

l 同样我们还可以同时设置多个Cookie:

//创建一个Cookie对象

Cookie cookie1 = new Cookie("username", "zhangsan");

Cookie cookie2 = new Cookie("password", "123456");

Cookie cookie3 = new Cookie("age", "20");

//将Cookie对象放入response对象中

response.addCookie(cookie1);

response.addCookie(cookie2);

response.addCookie(cookie3);

l 浏览器会以一下形式发送Cookie:

Cookie: username=zhangsan; password=123456; age=20

l 总之,设置Cookie就是两个步骤:

  1. 创建Cookie对象
  2. 将Cookie对象加入到response中

读取Cookie

l 读取Cookie主要指从读取浏览器中携带的Cookie

l 只需要通过一个方法就可以得到浏览器中的Cookie,在Servlet或JSP中通过request对象调用getCookies()方法可以获得浏览器传送过来的所有Cookie对象,返回的是一个Cookie数组,通过遍历Cookie数组可以获得所有的Cookie信息。

l 如:

//通过request的getCookies()方法获的Cookie数组

Cookie[] cookies = request.getCookies();

//判断数组是否为空

if(cookies != null){

//如果不为空遍历数组

for(Cookie cookie : cookies){

//获取cookie的名字

String name = cookie.getName();

//获取cookie的键

String value = cookie.getValue();

System.out.println(name+"---"+value);

}

}

Cookie有效时间

l 经过上边的介绍我们已经知道Cookie是存储在浏览器中的,但是可想而知一般情况下浏览器不可能永远保存一个Cookie,一来是占用硬盘空间,再来一个Cookie可能只在某一时刻有用没必要长久保存。

l 所以我们还需要为Cookie设置一个有效时间。

l 通过Cookie对象的setMaxAge()可以设置Cookie的有效时间。

l 其中setMaxAge()接收一个int型的参数,来设置有效时间。参数主要有一下四种情况:

1 设置为0,setMaxAge(0)

Cookie立即失效,下次浏览器发送请求将不会在携带该Cookie

2 设置大于0,setMaxAge(60)

表示有效的秒数60就代表60秒即1分钟,也就是Cookie在1分钟后失效。

3 设置小于0,setMaxAge(-1)

设置为负数表示当前会话有效。也就是关闭浏览器后Cookie失效

4 不设置

如果不设置失效时间,则默认当前会话有效。

Cookie的路径

l Cookie的路径指告诉浏览器访问那些地址时该携带该Cookie,我们知道浏览器会保存很多不同网站的Cookie,比如百度的Cookie,新浪的Cookie,腾讯的Cookie等等。那我们不可能访问百度的时候携带新浪的Cookie,也不可能访问每个网站时都带上所有的Cookie这是不现实的,所以往往我们还需要为Cookie设置一个Path属性,来告诉浏览器何时携带该Cookie。

l 我们同过Cookie的setPath()来设置路径,这个路径是由浏览器来解析的所以/代表服务器的根目录。

l 如:

设置为 /项目名/路径 à cookie.setPath(“/项目名/路径”)

这样设置只有访问“/项目名/路径”下的的资源才会携带Cookie

如:/项目名/路径/1.jsp 、/项目名/路径/hello/2.jsp 等

如果不设置,默认会在访问“/项目名”下的资源时携带

如:“/项目名/index.jsp” 、 “/项目名/hello/index.jsp”

HttpSession

l 使用Cookie有一个非常大的局限,就是如果Cookie很多,则无形的增加了客户端与服务端的数据传输量。而且由于浏览器对Cookie数量的限制,注定我们不能再Cookie中保存过多的信息,于是Session出现。

l Session的作用就是在服务器端保存一些用户的数据,然后传递给用户一个名字为JSESSIONID的Cookie,这个JESSIONID对应这个服务器中的一个Session对象,通过它就可以获取到保存用户信息的Session。

Session工作原理

l Session的创建

Session的创建时机是在request.getSession()方法第一次被调用时。

Session被创建后,同时还会有一个名为JSESSIONID的Cookie被创建。

这个Cookie的默认时效就是当前会话。

l Session的使用

Session被创建后,对应的Cookie被保存到浏览器中,之后浏览器每次访问项目时都会携带该Cookie。

当我们再次调用时会根据该JSESSIONID获取已经存在的Cookie,而不是在创建一个新的Cookie。

如果Cookie中有JSESSIONID,但是JSESSIONID没有对应的Session存在,则会重新创建一个HttpSession对象,并重新设置JSESSIONID。

Session时效

l 基本原则

Session对象在服务器端不能长期保存,它是有时间限制的,超过一定时间没有被访问过的Session对象就应该释放掉,以节约内存。所以Session的有效时间并不是从创建对象开始计时,到指定时间后释放——而是从最后一次被访问开始计时,统计其“空闲”的时间。

l 默认设置

在全局web.xml中能够找到如下配置:

<!-- ==================== Default Session Configuration ================= -->

<!-- You can set the default session timeout (in minutes) for all newly   -->

<!-- created sessions by modifying the value below.                       -->

<session-config>

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

</session-config>

说明Session对象默认的最长有效时间为30分钟。

l 手工设置

session.setMaxInactiveInterval(int seconds)

session.getMaxInactiveInterval()

l 强制失效

session.invalidate()

l 可以使Session对象释放的情况

n Session对象空闲时间达到了目标设置的最大值,自动释放

n Session对象被强制失效

n Web应用卸载

n 服务器进程停止

URL重写

l 在整个会话控制技术体系中,保持JSESSIONID的值主要通过Cookie实现。但Cookie在浏览器端可能会被禁用,所以我们还需要一些备用的技术手段,例如:URL重写。

l URL重写其实就是将JSESSIONID的值以固定格式附着在URL地址后面,以实现保持JSESSIONID,进而保持会话状态。这个固定格式是:URL;jsessionid=xxxxxxxxx

l 例如:

targetServlet;jsessionid=F9C893D3E77E3E8329FF6BD9B7A09957

l 实现方式:

n response.encodeURL(String)

n response.encodeRedirectURL(String)

n 例如:

//1.获取Session对象

HttpSession session = request.getSession();

//2.创建目标URL地址字符串

String url = "targetServlet";

//3.在目标URL地址字符串后面附加JSESSIONID的值

url = response.encodeURL(url);

//4.重定向到目标资源

response.sendRedirect(url);

Session活化和钝化

l Session机制很好的解决了Cookie的不足,但是当访问应用的用户很多时,服务器上就会创建非常多的Session对象,如果不对这些Session对象进行处理,那么在Session失效之前,这些Session一直都会在服务器的内存中存在。那么就,就出现了Session活化和钝化的机制。

l Session钝化:Session在一段时间内没有被使用时,会将当前存在的Session对象序列化到磁盘上,而不再占用内存空间。

l Session活化:Session被钝化后,服务器再次调用Session对象时,将Session对象由磁盘中加载到内存中使用。

l 如果希望Session域中的对象也能够随Session钝化过程一起序列化到磁盘上,则对象的实现类也必须实现java.io.Serializable接口。不仅如此,如果对象中还包含其他对象的引用,则被关联的对象也必须支持序列化,否则会抛出异常:java.io.NotSerializableException

l 一般情况下,当服务器停止时,Session对象会被写入到硬盘中,然后当服务器再次启动时,会自动将硬盘中的对象加载进内存。

l 当访问服务器的用户过多时,会有非常多的会话产生,这些会话,每一个会话都会对应一个HttpSession对象。这时在服务器的内存会存在大量的Session对象,但是这些对象并不是都在使用中,所以我们希望将这些不使用的Session对象钝化到硬盘中,当这些对象再次使用时,在活化进内存。

l 在Tomcat的配置文件conf/context.xml文件的根标签中加入如下代码

<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">

<Store className="org.apache.catalina.session.FileStore" directory="mySession" />

</Manager>

maxIdleSwap属性:指Session闲置时间,当闲置一定时间以后,会自动钝化到硬盘中

directory属性:Session钝化后的目标文件夹

 

会话控制cookie和session的更多相关文章

  1. http协议。会话控制cookie、session

    http协议是无状态的协议.每次访问页面的http协议都是独立的,正是因为http协议是无状态的,所以导致访问一个页面后再去访问另一个页面的时候,一些数据会消失,比如:用户的登录信息就会消失.那么怎么 ...

  2. 会话控制:Cookie和session

    HTTP(超文本传输协议)定义了通过万维网(WWW)传输文本.图形.视频和所有其他数据所有的规则.HTTP是一种无状态的协议,说明每次请求的处理都与之前或之后的请求无关.虽然这种简化实现对于HTTP的 ...

  3. 会话控制——Cookie和Session

    Cookie简介 l  HTTP是无状态协议,服务器不能记录浏览器的访问状态,也就是说服务器不能区分中两次请求是否由一个客户端发出.这样的设计严重阻碍的Web程序的设计.如:在我们进行网购时,买了一条 ...

  4. 会话技术: Cookie 和 Session

    会话技术 会话技术:从浏览器开始访问服务器,到关闭浏览器,这期间发生了许多次请求和响应,这个过程就叫做一次会话. Cookie 和 Session 都是处理会话技术的两种具体实现,Cookie将数据保 ...

  5. 会话技术cookie和session详解

    什么是会话 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 会话技术解决了什么问题 每个用户与服务器进行交互的过程中,各自会有一 ...

  6. PHP-会话控制Cookie和Session

    会话控制:就是为了我们在访问页面和页面之间的跳转是,能够识别到你的登录状态,已经你的登录时长等 在php的会话控制当中,涉及到两个概念Cookie和Session Cookie 会话控制 原理:在登录 ...

  7. 会话管理---Cookie与Session

    会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 保存会话数据的两种技术:Cookie,Session Cookie是客户端技术, ...

  8. 会话跟踪Cookie与Session

    会话跟踪用来跟踪用户的整个会话,常用的是Session和Cookie.Cookie通过客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 1.Cookie  1.1概念及使 ...

  9. Servlet 会话技术cookie和session

    会话技术 Cookie技术:会话数据保存在浏览器客户端. Session技术:会话数据保存在服务器端. 一.Cooke技术 1. 特点 Cookie技术:会话数据保存在浏览器客户端. 2 .Cooki ...

随机推荐

  1. java的多线程初体验

    这里以车站售票作为模拟场景,多个票务人员同时出售某一列高铁(G250?)的车票,售票的基本保证有2点: 1.不能售出多于预定限额的车票. 2.不能售出具有相同座位的车票. 初学java,有不当的地方各 ...

  2. eclipse打开时提示:failed to create the java virtual machine

    Eclipse打开时提示: failed to create the java virtual machine 原因:C盘空间不够   编辑删除 处理:1.用金山清理临时文件: 2.用金山手机卫士连接 ...

  3. JavaScript 的 作用域

    在看了几本书之后的一些理解和自己的想法.   作用域,变量的作用范围   在ES6之前 变量的声明   只有var可以声明变量属于某个作用域,并且,也只有全局作用域和函数作用域. (没有var声明的变 ...

  4. 使用TinyXML进行XML操作

    本例基于TinyXML实现XML的自动解析和创建,由于本人是菜鸟刚入门,例子中添加了enum.struct.vector.map.list的常见用法,首先添加6个tinyxml工程文件,然后设置调试参 ...

  5. Python爬虫番外篇之Cookie和Session

    关于cookie和session估计很多程序员面试的时候都会被问到,这两个概念在写web以及爬虫中都会涉及,并且两者可能很多人直接回答也不好说的特别清楚,所以整理这样一篇文章,也帮助自己加深理解 什么 ...

  6. cocos 射线检测 3D物体 (Sprite3D点击)

    看了很多朋友问怎么用一个3D物体做一个按钮,而且网上好像还真比较难找到答案, 今天翻了一下cocos源码发现Ray 已经封装了intersects函数,那么剩下的工作其实很简单了, 从屏幕的一个poi ...

  7. (转)Linux命令grep

    场景:grep命令在文件搜索中经常会使用到,所以熟练掌握该命令对于日常日志搜索相当有必要! Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.g ...

  8. MySQL学习笔记(五):MySQL表级锁和行级锁

    一:概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking ...

  9. 19. leetcode 100. Same Tree

    Given two binary trees, write a function to check if they are equal or not. Two binary trees are con ...

  10. hdu 6047 Maximum Sequence(贪心)

    Description Steph is extremely obsessed with "sequence problems" that are usually seen on ...