会话Cookie及session的关系(Cookie & Session)

会话Cookie及session的关系(Cookie & Session)

在通常的使用中,我们只知道session信息是存放在服务器端,而cookie是存放在客户端。但服务器如何使用session和客户端之间进行通信,以及jsessionId是怎么回事,这并没有一个完整和正确的认识,因此这里将这类信息汇总。

session中的jsessionId是在session创建好之后,发送给客户端。然后在每一次请求中,客户端即会将这个信息传递给服务器端,服务器端使用这个信息来维护和客户端之间的会话通信,在浏览器关闭之后,这个session就消失了。
而对于普通的cookie来说,它是有着一定的时间存放在客户端的机器中的。当下次打开浏览器时,这个cookie就会被读取,同时在请求时发放到服务器端。在关闭浏览器,这个cookie仍然存在的,并没有消失。
那么,这两者之间有没有联系呢,这就要看官方对于Cookie的不同分类,其实就对应着session Cookie和psersistent Cookie的描述了。如下所示:

Session Cookie
A user‘s session cookie[15] (also known as an in-memory cookie or transient cookie) for a website exists in temporary memory only while the user is reading and navigating the website. When an expiry date or validity interval is not set at cookie creation time, a session cookie is created. Web browsers normally delete session cookies when the user closes the browser.

Persistent cookie
A persistent cookie[15] will outlast user sessions. If a persistent cookie has its Max-Age set to 1 year (for example), then, during that year, the initial value set in that cookie would be sent back to the server every time the user visited the server. This could be used to record a vital piece of information such as how the user initially came to this website. For this reason, persistent cookies are also called tracking cookies.

从上面的描述中看,所谓的session Cookie,就是我们所说的session,其实就是一个没有设置过期时间的cookie信息。而普通的cookie,即我们通常所说的cookie,就是设置了过期时间(有效时间,通常大于一个特定的值,如一周)的cookie。

那么,我们可以这样认为。session就是服务器端,通过使用session Cookie来维系客户端和服务器的关系,而所谓的存储就是在服务器端针对这个session值(如jsessionId值)作了一个内部的增强,可以围绕着这个session Cookie创建一个单独的数据存储器(如map),然后来实现我们所谓的session数据存储呢。既然这样,在一些特定的场景(如分布式环境),是否可以按照这种设计思路设计另外的session存储呢,这也是可以的。

接下来,我们可测试一下这种思路,是否正确。有两个很简单的servlet,一个为写cookie,另一个为读cookie。如下所示:


01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

//writeServlet

//add memory cookie

        Cookie cookie = new Cookie("memoryCookie", "12345678");

        cookie.setMaxAge(-1);

        resp.addCookie(cookie);

        //add normal cookie

        cookie = new Cookie("persistentCookie", "abcdefg");

        cookie.setMaxAge(300);//one minute

        resp.addCookie(cookie);

//readServlet

Cookie[] cookies = req.getCookies();

        for(Cookie cookie : cookies) {

            System.out.println(

                    cookie.getPath() + "->" + cookie.getName() + "->" + cookie.getValue() + "->" + cookie.getMaxAge());

        }

1    未访问write,直接访问read时

开启F12,查看浏览器端的请求信息,如下所示:

只上传了一个jsession信息(这里是因为我修改了sessionName的原因)。

而在后台,打印结果如下所示:


1

null->tomcat7utf8_session->F5B543F5D5FD4A9B78CA18D96D4CE995->-1

即只有jsessionId信息。

2    访问write,再访问read

开启F12,我们查看一下访问write之后 的cookie情况,如下所示:

以上图为响应头信息。

可以看出,在响应返回时,服务器返回了2个cookie,而key为memoryCookie的信息并没有过期信息.

那我们再访问一下write,相应信息如下所示.
这是请求头信息:

而相应的cookie信息也同样如下所示:

在后台,打印的cookie信息如下所示:


1

2

3

null->tomcat7utf8_session->F5B543F5D5FD4A9B78CA18D96D4CE995->-1

null->memoryCookie->12345678->-1

null->persistentCookie->abcdefg->-1

这里显示的maxAge是-1,这是因为客户端本身就没传递相应的maxAge,所以未获取到。并且这个信息从获取来说,并没有实际性的意义。

3 关闭浏览器,再访问read

我们关闭一次浏览器,再看一下相应的数据信息,如下所示:

后台打印信息如下:
null->persistentCookie->abcdefg->-1
null->tomcat7utf8_session->6B6E27A4F6B71853CC2D2C58BEE83238->-1

即可以看出,在重新打开浏览器(并且之前写的persistentCookie并没有过期)时,在请求后台读取时,只会发送有效的信息。而之前的内存cookie已随着浏览器关闭消失了,所以这里才只会有2个信息。
需要注意的,这里的关闭浏览器,是把所有的标签界面均关闭。在IE中,标签而中是共享Cookie的,所以只关闭一个标签是没有作用的。

4 如何创建的Session

这里,我们来查看一下在后台是如何创建session,并同时产生相应的cookie信息的。我们可以这样认为,当我们请求后台session时,如果没有相应的cookie信息,后台会产生一个相应的cookie,并发到客户端(即调用response.addCookie方法)。来看一下后台的实现是否如我们所说呢(这里以tomcat实现为参考),相应的代码在类Request.doGetSession中,如下所示:


01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

    protected Session doGetSession(boolean create) {

。。。。。。

//这里尝试获取session或者创建一个新的session

        // Attempt to reuse session id if one was submitted in a cookie

        // Do not reuse the session id if it is from a URL, to prevent possible

        // phishing attacks

        if (connector.getEmptySessionPath()

                && isRequestedSessionIdFromCookie()) {

//这里如果客户端显示传递了一个sessionId,这里直接从session池中获取,如果获取失败则直接返回null,被认为是客户端数据有问题或者是其它攻击

            session = manager.createSession(getRequestedSessionId());

        } else {

            session = manager.createSession(null);

        }

        //这里就是创建一个新的cookie,并放置在response头中

        // Creating a new session cookie based on that session

        if ((session != null) && (getContext() != null)

               && getContext().getCookies()) {

            String scName = context.getSessionCookieName();

            if (scName == null) {

                scName = Globals.SESSION_COOKIE_NAME;

            }

//name即jsessionId或配置的sessionName value即我们所说的sessionId

            Cookie cookie = new Cookie(scName, session.getIdInternal());

            configureSessionCookie(cookie);

            response.addSessionCookieInternal(cookie, context.getUseHttpOnly());

        }

。。。。。。

    }

可以看出,这和我们的大致思路是一样的。

5 Cookie中的HttpOnly

The HttpOnly attribute is supported by most modern browsers.[19][20] On a supported browser, an HttpOnly session cookie will be used only when transmitting HTTP (or HTTPS) requests, thus restricting access from other, non-HTTP APIs (such as JavaScript). This restriction mitigates but does not eliminate the threat of session cookie theft via cross-site scripting (XSS).[21] This feature applies only to session-management cookies, and not other browser cookies.

现在的浏览器已经支持在cookie中增加一个新的httpOnly选项,这个选项就表示这个cookie只用于在浏览器请求中使用,而不能被其它方式读取和设置。比如,httpOnly式的cookie就不能被js读取到(而常规的cookie是可以读取的)。

在最新的J2EE6.0即Servlet3.0中,已经支持直接在Cookie上设置httpOnly选项了。而在之间的版本,如tomcat,则可以在context.xml中设置是否支持httpOnly选项。针对像session Cookie这种会话式cookie,建议是使用httpOnly的,并且默认也是直接使用此标记的。

转载请标明出处:i flym
本文地址:http://www.iflym.com/index.php/code/201402170002.html

时间: 2024-10-13 01:51:43

会话Cookie及session的关系(Cookie & Session)的相关文章

{Django基础八之cookie和session}一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session

本节目录 一 会话跟踪 二 cookie 三 django中操作cookie 四 session 五 django中操作session 六 xxx 七 xxx 八 xxx 一 会话跟踪 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而10086服务人员就是服务器了.从双方接通电话那一刻起,会话就开始了,到某一方挂断电话表示会话结束.在通话过程中,你会向10086发出多个请求,那么这多个请

cookie和session的关系及细节操作及总结

## cookie cookie是存储在浏览器端的,浏览器发请求时会自动把[所有]cookie值发送到服务器!document.cookie (多次设置,不会覆盖!) - 赋值 + document.cookie="字符串" // cookie只能给字符串值- 获取: + document.cookiedocument.cookie是原生的js操作 jquery操作cookie插件github地址 (https://github.com/carhartl/jquery-cookie)

<原创>一串简单的代码牵扯出的session,cookie,$_session,$_cookie之间关系问题

上述代码会产生怎么样的结果? a.php:  //报错 这个页面的值不难,将会报出一个notice( Undefined index: a)错误,因为cookie的返回值具有慢一拍特性,在页面中设置setcookie后,当用户访问时,需要把cookie键值对包含在http响应头返回给客户端,当你下次访问的时候,浏览器会着这份具有cookie值的请求头请求服务器,服务器也就知道当前的客户端存在这一份cookie值,然后再用到其他业务逻辑. b.php: //abc 这个页面的值是abc,其实第一次

SESSION和COOKIE的作用和区别,SESSION信息的存储方式,如何进行遍历?

二者的定义:当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择,都纪录下来.当下次你再光临同一个网站,WEB 服务器会先看看有没有它上次留下的 Cookie 资料,有的话,就会依据 Cookie里的内容来判断使用者,送出特定的网页内容给你. Cookie 的使用很普遍,许多有提供个人化服务的网站,都是利用 Cookie来辨认使用者,以方便送出使用者量身定做的内容,像是 Web 接口的免费 email 网站,都要用到 Cooki

php session机制与cookie机制以及联系与区别

session与cookie是在做项目中很常用的会话技术,session与cookie也是面试中被问到频率最高的问题,有一次我去面试,面试官就怼着我session与cookie一直问(头都大了),下面总结了一些关于session与cookie的区别与联系. 说到session与cookie,先说一下什么是会话技术: 由于http协议是无状态的协议,也就是说当一个用户在请求一个页面后再请求另一个页面时,http将无法告诉我们这两个请求是否来自于同一个用户,这就意味着我们需要有一种机制来跟踪和记录用

session超时和cookie过期

一.Cookie的过期和Session的超时有什么区别? 会话的超时由服务器来维护,它不同于Cookie的失效日期.首先,会话一般基于驻留内存的cookie不是持续性的cookie,因而也就没有截至日期.即使截取到JSESSIONID cookie,并为它设定一个失效日期发送出去.浏览器会话和服务器会话也会截然不同. 二.session cookie和session对象的生命周期是一样的吗? 当用户关闭了浏览器虽然session cookie已经消失,但session对象仍然保存在服务器端 三.

基于Cookie的Session和禁用Cookie的Session

Session简介 session的作用 它是一种在客户端与服务器之间保持状态的解决方案,它将会话信息(uid等)供浏览器后续请求使用,可以获取并修改变量的值.和cookie一起使用识别同一个客户. session何时创建 客户首次访问服务器时,session被创建并分配一个唯一的session_id,并将这个session_id传入客户端cookie中,保持客户端与服务器端的session_id一致. 如何确认某一位用户?session的有效时间 当用户再次访问浏览器时,会通过cookie传递

session机制、cookie机制

一.Cookie机制 在web程序中是使用HTTP协议来传输数据的,因为http是无状态协议,一旦数据交换完毕,客户端和服务器端的连接就会关闭,再次交换数据需要建立新的连接,所以无法实现会话跟踪,cookie技术则弥补了这一缺陷. cookie实际上一段的文本信息,客户端请求服务器.如果服务器需要记录该用户的状态,就使用response向客户端浏览器颁发一个cookie.客户端浏览器会把cookie保存起来.当浏览器再请求该网站时,浏览器把请求的网址连同该cookie一同提交给服务器.服务器检查

session.use_trans_sid php的session中sesionid 和cookie

附:文摘 ============================================================ 在PHP中使用过SESSION的朋友可能会碰到这么一个问题,SESSION变量不能跨页传递.这令我苦恼了好些日子,最终通过查资料思考并解决了这个问题.我认为,出现这个问题的原因有以下几点: 1.客户端禁用了cookie 2.浏览器出现问题,暂时无法存取cookie 3.php.ini中的session.use_trans_sid = 0或者编译时没有打开--enab