`
com_xpp
  • 浏览: 372138 次
社区版块
存档分类
最新评论

Session那些事(二)

阅读更多

关于Session和Cookie的关系,这里详细分析一些

1.Cookie
Cookie是服务器在本地机器上存储的小段文本,它是一个简单的字符串形式的键值对。
网络服务器用HTTP头向客户端发送cookie,
(一般情况下Cookie是由服务端生成的,当然js也能操作cookie)
在客户端,浏览器解析这些cookies并将它们保存到本地,
而后当浏览器访问这个服务器时,它会在任何请求上加上这些cookie。
说白了就是每次你和服务器的交互都会带着这些cookie。

2.Cookie 与Session的关系
我们知道session是在服务端的,http又是无状态协议,而seesion又是靠session id来区分的,
因此为了传递session id让服务器识别,这个session id就存放在了cookie中。
(另一种方式是将session id放到url后面,后面我会提到)
因为每次向服务器发送请求时,http头都会带着cookie,
所以服务端就很方便地根据cookie读取出来的session id来区分各个请求的session。

比如我现在访问我测试用的servlet,在servlet代码中写上

HttpSession session = request.getSession();这样我就能建立一个session了。

用火狐访问,查看firebug的网络信息,我们可以发现他的响应信息中有
Set-Cookie JSESSIONID=5A810D07A1FB78122FFC2A74CA04F255; Path=/Test01/; HttpOnly
这些字样,这说明访问服务器的时候,服务端把seesion id写入到了cookie,
让客户端浏览器把cookie保存起来。

到这里我们似乎可以发现些什么,不知道你看到没有?
发送请求的时候带着cookie信息,
从响应信息里我们又看到了让浏览器设置cookie的信息,

发送请求 响应

从而我们可以得出,在servlet中,想获得cookie,我们需要从request中取,
下面这段代码就可以在控制台中把客户端过来的cookie信息都打印出来。

Cookie[] cs=request.getCookies();
for(int i=0;i<cs.length;i++){
  System.out.println(cs[i].getName());
  System.out.println(cs[i].getValue());
}而当你想添加cookie时就得往response里添加。

Cookie c = new Cookie("mycookie","cookie1234");
c.setMaxAge(3000);//设置cookie有效期, 单位为秒
response.addCookie(c);添加了这个cookie后,你会在刚才控制台的cookie打印中看到你这个mycookie信息。

3. 当客户端禁用了Cookie时,如何识别各个session
其实servlet中可以重写url,让他在url后面加上
;jsessionid=52156A910E95E259B6A2C13CC4DAA916
来识别。
我们可以在servlet中写上response.encodeURL(“test”),这样的话,
当session建立的时候,而客户端不支持cookie,则编码后的url为
test;jsessionid=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
若session没有建立,则编码后的url仍旧为test
当然如果session建立,客户端支持cookie的话,那么编码后的url也为test。

4.内存Cookie和普通Cookie的区别:
Session的是以cookie或URL重写实现的,默认是cookie来实现的。
系统会创造一个名为JSESSIONID的输出cookie,这种Cookie叫做session cookie,
这个session cookie有区别persistent cookies,也就是我们通常所说的普通的cookie。


特别值得注意的时:
session cookie是存储于浏览器内存中的,即所谓的内存cookie,并不是写到硬盘上的,
而普通的cookie则是存在硬盘上的。
我们刚才看到的JSESSIONID就是一个session cookie,我们通常情是看不到JSESSIONID的,
但是当我们把浏览器的cookie禁止后,web服务器会采用URL重写的方式传递session id,
我们就可以在地址栏看到JSESSIONID=XXXXXXXXXXXXXXXXXXXX之类的字符串了。

明白了这个,我们就可以很容易的分辨出persistent cookies和session cookie的区别了。
另外关于两者安全性也就很清楚了:
session cookie针对某一次会话而言,会话结束session cookie也就随着消失了;
而persistent cookie只是存在于客户端硬盘上的一段文本,
可以在服务端建立cookie时来设置任意有效期,
而且可能会遭到cookie欺骗以及针对cookie的跨站脚本攻击,
自然不如session cookie安全了。

12
0
分享到:
评论
2 楼 w156445045 2012-06-09  
不错不错,谢谢博主提供!
1 楼 liweiquan 2012-06-07  

相关推荐

    jboss session 复制二

    【JBoss Session复制二】 在Java Web开发中,Session是服务器端用来跟踪用户状态的关键机制。当用户在多个页面间导航时,服务器需要保持用户的登录状态、购物车信息等,这时就会用到Session。在分布式环境中,如...

    springboot +shiro+redis实现session共享(方案二)1

    "Spring Boot + Shiro + Redis 实现 Session 共享方案二" 1. 概述 本文档旨在介绍如何使用 Spring Boot、Shiro 和 Redis 实现分布式 session 共享,以解决 Web 应用程序的登录 session 统一问题。 2. 相关依赖 ...

    j2ee实验二:学习使用Session和Cookie

    ### j2ee实验二:学习使用Session和Cookie #### 实验背景与目标 在现代Web应用开发中,理解和掌握会话管理和用户认证是至关重要的。本实验旨在通过一系列实际操作来帮助学生熟悉J2EE环境下Session和Cookie的工作...

    sessionsession

    销毁Session通常有两种方式:一是通过编程方式调用session.invalidate()方法,二是服务器设置的Session超时时间到达,服务器会自动清理过期的Session。 3. **Session的存储** Session数据存储在服务器的内存中,...

    iframe 跨域访问session

    然而,这在某些场景下会带来不便,比如当我们希望在不同的二级域名或者完全不同的域名之间共享用户认证信息时。`iframe` 跨域访问`session`正是为了解决这一问题。 首先,让我们了解一下`session`和`cookie`的关系...

    session实验

    5. **安全性**:实验可能探讨了防止Session劫持和Session固定攻击的方法,如使用HTTPS传输Session ID,定期更新Session ID,限制Session ID的长度和复杂性,以及对敏感操作进行二次验证。 6. **性能优化**:在高...

    NET的csharp的session丢失sessionid不一样

    #### 二、SessionID的变化原因分析 SessionID的变化主要与客户端浏览器的行为以及服务器端如何处理Session有关。在默认情况下,.NET框架通过HTTP Cookie来存储SessionID,这意味着SessionID是通过客户端浏览器来...

    tomcat-redis-session-manager实现session共享 配置文件

    **二、Tomcat-Redis-Session-Manager概述** Tomcat-Redis-Session-Manager是基于Apache Tomcat的Session管理器,通过集成Redis作为Session持久化存储,实现了跨服务器的Session共享。它将Tomcat中的Session数据序列...

    session之用户交互间隔&&session持久化

    ### 二、Tomcat 中 Session 的管理 #### 2.1 Session 的创建与销毁 - **创建**:当用户第一次访问服务器时,如果没有提供有效的 Session ID,则服务器会为该用户创建一个新的 Session,并将 Session ID 存储在 ...

    一篇优秀Session讲解

    ### 一篇优秀Session讲解 在深入探讨Session的概念之前,我们先简单回顾一下Session的基本定义及其在Web应用中的重要性。Session是一种用于维护客户端与服务器之间交互状态的技术,它能够跟踪用户的活动并保存用户...

    设定tomcat中session过期时间.txt

    #### 二、通过`web.xml`文件为特定Web应用设置Session超时时长 **方法介绍**: - 对于希望为某个具体的Web应用程序单独设置Session超时时间的情况,可以在该Web应用的`web.xml`文件中进行配置。 - 同样采用分钟为...

    请问ASPX中如何读取SESSION变量

    #### 方法二:检查Session变量是否存在 ```csharp string str; if (Session["UserName"] != null) { str = Session["UserName"].ToString(); } ``` 这种方法在读取`Session`变量之前先检查了变量是否存在。如果`...

    tomcat redis session.rar

    5. **Session同步策略**:主要有两种常见的实现方式,一是使用Redis的`setnx`(Set if Not eXists)命令保证Session的唯一性,二是通过`pub/sub`(发布/订阅)模式实现实时同步。前者适用于简单场景,后者更适用于...

    session生命周期的设置

    二、Session的生命周期 默认情况下,Session的生命周期通常为30分钟。这意味着从创建Session到其失效,如果在这段时间内用户没有任何操作,Session就会被服务器自动销毁。这个时间可以通过编程方式或者配置文件进行...

    Java关于session的详细解释

    #### 二、Session的工作原理 当一个用户访问网站时,服务器会为其创建一个唯一的Session,并将一个Session ID通过Cookie的形式发送给客户端浏览器。之后,每当用户发起请求时,浏览器都会自动携带这个Session ID,...

    asp.net 二级域名间SessIon共享

    本程序实现如何在SiteA 实现共享 SiteB 中Session 的信息;本程序介绍了如何在使用IHttpModule 在Init 中进行Session共享处理。以及站点密钥的使用。(注意一点的就是)两个站点如果要实现Session共享 相同密钥是...

    asp.net c# 在类中使用session的方法

    ### 二、在类中使用Session的步骤 要在类中使用Session,首先需要确保当前上下文(HttpContext)可用。因为Session是在请求上下文中存在的,所以在非HTTP请求处理的代码中(如后台任务或定时任务)直接访问Session...

    集中式session管理方案

    二、适用场景 集中式Session管理适用于以下情况: - 当多个相同类型但相互独立的系统之间需要共享Session信息。 - 在没有启用集群或者关闭了集群自动同步机制的环境中,为了提高性能,需要手动处理Session同步。 ...

    android获取web服务器端session并验证登陆

    二、Android与服务器交互 在Android应用中,我们可以使用HttpURLConnection或第三方库如OkHttp来与Web服务器进行通信。这些库支持发送HTTP请求,并处理响应。在发送请求时,我们需要在请求头中添加Session ID,以便...

    Session详解(主要讲Session跟Cookic区别)

    ### Session与Cookie的区别详解 #### 一、Session与Cookie的基本概念 **Session**与**Cookie**都是Web开发中用于在客户端与服务器之间维持状态的重要工具。它们各自具有独特的特性和应用场景,下面我们将深入探讨...

Global site tag (gtag.js) - Google Analytics