会话控制cookie和session

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钝化后的目标文件夹

 

时间: 2024-07-30 10:12:49

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

PHP 会话控制 cookie与session 全解析

Cookie 简介 Cookie是存储在客户端浏览器中的数据,我们通过Cookie来跟踪与存储用户数据. 一般情况下,Cookie通过HTTP headers从服务端返回到客户端.多数web程序都支持Cookie的操作,因为Cookie是存在于HTTP的标头之中,所以必须在其他信息输出以前进行设置,类似于header函数的使用限制. PHP通过 setcookie 函数进行Cookie的设置,任何从浏览器发回的Cookie,PHP都会自动的将他存储在 $_COOKIE 的全局变量之中,因此我们可

会话控制——Cookie和Session

Cookie简介 l  HTTP是无状态协议,服务器不能记录浏览器的访问状态,也就是说服务器不能区分中两次请求是否由一个客户端发出.这样的设计严重阻碍的Web程序的设计.如:在我们进行网购时,买了一条裤子,又买了一个手机.由于http协议是无状态的,如果不通过其他手段,服务器是不能知道用户到底买了什么.而Cookie就是解决方案之一. l  Cookie实际上就是服务器保存在浏览器上的一段信息.浏览器有了Cookie之后,每次向服务器发送请求时都会同时将该信息发送给服务器,服务器收到请求后,就可

2014-07-09 Java Web的学习(5)-----会话管理(Cookie和Session)

1.什么是会话 会话,牛津词典对其的解释是进行某活动连续的一段时间.从不同的层面看待会话,它有着类似但不全然相同的含义.比如,在web应用的用户看来,他打开浏览器访问一个电子商务网站,登录.并完成购物直到关闭浏览器,这是一个会话.而在web应用的开发者开来,用户登录时我需要创建一个数据结构以存储用户的登录信息,这个结构也叫做会话.因此在谈论会话的时候要注意上下文环境.而本文谈论的是一种基于HTTP协议的用以增强web应用能力的机制或者说一种方案,它不是单指某种特定的动态页面技术,而这种能力就是保

会话技术: Cookie 和 Session

会话技术 会话技术:从浏览器开始访问服务器,到关闭浏览器,这期间发生了许多次请求和响应,这个过程就叫做一次会话. Cookie 和 Session 都是处理会话技术的两种具体实现,Cookie将数据保存在客户端,Session将数据保存在服务器端. Cookie技术 1.Cookies是存储在客户机的文本文件,可以保存一系列的信息.通常服务器有三个步骤来识别不同的客户机: 服务器脚本发送一系列cookies至浏览器.比如名字,年龄,ID号码等等. 浏览器在本地机中存储这些信息. 当下一次浏览器发

会话控制 COOKIE SESSION

cookie setcookie(名称,值,过期时间,有效路径,有效域,安全); setcookie('username','zhangshuo',time()+3600,'/'); 退出cookie: setcookie('username',null,-3600,'/'); <?phpsetcookie('username','zhangshuo',time()+3600,'/'); <?phpheader("content-type:text/html;charset=utf-

php学习笔记-会话控制简单介绍session和cookie

session_stater();会话控制HTTP协议 在tcp协议基础上HTTP 协议称无状态协议SESSION的特点: 1存储在服务器: 2每个使用者都会生成一个session: 3有默认的过期时间大概是15分钟左右: 4session可以存储任意类型的数据: COOKIE的特点: 1存储在客户端: 2每个使用者都会生成一个cookie: 3默认没有过期时间的但你可以自己设置过期时间: 4只能存储字符串SESSION :安全 但对服务器要求太高:COOKIE:灵活 不安全session的使用

会话技术cookie和session详解

什么是会话 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 会话技术解决了什么问题 每个用户与服务器进行交互的过程中,各自会有一些数据,程序要想办法保存每个用户的数据. 例如:用户点击超链接通过一个servlet购买了一个商品,程序应该保存用户购买的商品,以便于用户点结帐servlet时,结帐servlet可以得到用户商品为用户结帐. 会话技术分类 会话技术会为两类 Cookie Cookie是客户端技术,程序把每个用户的数

http协议。会话控制cookie

http协议是无状态的协议.每次访问页面的http协议都是独立的,正是因为http协议是无状态的,所以导致 访问一个页面后再去访问另一个页面的时候,一些数据会消失,比如:用户的登录信息就会消失.那么怎么才能使 用户的信息不消失呢?就是使用会话控制. 当然除了会话控制,有没有什么方法让变量在不同的页面之中都有效.答:有(1)通过get或post方式从一个页面中传到另一个页面中(只适合传输数据量小的,数据量变大就不合适了)(2)可以把变量先存储到数据库中,或者使用file_put_content()

会话跟踪Cookie与Session

会话跟踪用来跟踪用户的整个会话,常用的是Session和Cookie.Cookie通过客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份. 1.Cookie  1.1概念及使用方法 Cookie实际上是一小段文本信息.客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie.客户端浏览器会把Cookie保存起来,当浏览器再请求该网站时,把请求的网址连同该Cookie一同交给服务器.服务器检查该Cookie,以此来辨认用户状