搜档网
当前位置:搜档网 › session的机制(转载)

session的机制(转载)

session的机制(转载)
session的机制(转载)

1.Session

由于HTTP协议连接的无状态性,才使得session的不得已而产生。既然Web应用并不了解有关同一用户以前请求的信息,那么解决这个问题的一个办法是使用Servlet/JSP容器提供的会话跟踪功能,Servlet API规范定义了一个简单的HttpSession接口,通过它我们可以方便地实现会话跟踪。

HttpSession接口提供了存储和返回标准会话属性的方法。标准会话属性如会话标识符、应用数据等,都以“名字-值”对的形式保存在服务器端。也就是说,HttpSession接口提供了一种把对象保存到内存、在同一用户的后继请求中提取这些对象的标准办法。在会话中保存数据的方法是setAttribute(String s, Object o),从会话提取原来所保存对象的方法是getAttribute(String s)。

在服务器端,每当新用户请求了一个使用HttpSession对象的JSP页面,Servlet、JSP容器除了发回应答页面外,它还要以cookie的形式向浏览器发送一个特殊数字,即“绘画标识符”,它是一个唯一的用户标示符,浏览器在请求session时,服务器会先得到它的sessionId,在做处理。

会话标识符以Cookie的形式在服务器和浏览器组件传送,标准会话属性在服务器端也是以会话的形式存在,并且这个Cookie的生命周期只是临时的,即会话结束后就自动消失,没有为它指定固定的生命周期,因此可以说session是基于Cookie的技术。另外,如果客户端不支持Cookie,运用URL重写机制来保证会话标识回服务器。

2.session机制的实现:

(1.)session机制是一种服务器端的机制,

用来在无状态的HTTP协议下越过多个请求页面来维持状态和识别用户。

当程序需要为某个客户端的请求创建一个session的时候,

服务器首先检查这个客户端的请求里是否已包含了一个session标识。

这个标识称为session id,

如果已包含一个session id则说明以前已经为此客户端创建过session,

服务器就按照session id把这个session检索出来使用,

若没有创建过,则创建一个新的Session。

那么这个session是什么时候创建的呢?

之前一直错误地理解为:

当用户向服务器发起请求时,这个session便会立刻建立起来,

但实际上却根本不是这样。

在Servlet中,你肯定用过下面这句话,

HttpSession session = request.getSession();如果当前没有session,则会立刻建立一个session;

如果有session则返回当前session。

这句话和

HttpSession session = request.getSession(true);的效果是一样的。

但是如果你写成

HttpSession session = request.getSession(false);则不会自动建立session。

若当前没有session,你所得到的seesion只会是一个null。

总结:

session不是一打开网站就会立刻建立。

它的建立需要基于下面两个条件中的任意一个:

a:在servlet中手动调用

HttpSession session = request.getSession();或者

HttpSession session = request.getSession(true);2:jsp中没有写

(默认情况下它是的)

如果两个条件同时都不满足,那么你建立的只是一个无seesion的连接。

(2.) session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。

当程序需要为某个客户端的请求创建一个session的时候,

第一步:

服务器首先检查这个客户端的请求里是否已包含了一个session标识- 称为session id,

此时就是两种可能,客户机有session id或者没有session id

第二步:

如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个)如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id

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

三、保存session id 的方法

一)、cookie:

二)、URL重写:

cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id 传递回服务器。经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL 路径

的后面。

3.session与Cookie的实现原理

Session 与Cookie 的作用都是为了保持访问用户与后端服务器的交互状态。它们有各自的优点也有各自的缺陷。然而具有讽刺意味的是它们优点和它们的使用场景又是矛盾的,例如使用Cookie 来传递信息时,随着Cookie 个数的增多和访问量的增加,它占用的网络带宽也很大,试想假如Cookie 占用200 个字节,如果一天的PV 有几亿的时候,它要占用多少带宽。所以大访问量的时候希望用Session,但是Session 的致命弱点是不容易在多台服务器之间共享,所以这也限制了Session 的使用。

不管Session 和Cookie 有什么不足,我们还是要用它们。下面详细讲一下,Session 如何基于Cookie 来工作。实际上有三种方式能可以让Session 正常工作:

1.基于URL Path Parameter,默认就支持

2.基于Cookie,如果你没有修改Context 容器个cookies 标识的话,默认也是支持的

3.基于SSL,默认不支持,只有connector.getAttribute("SSLEnabled") 为TRUE 时才支持

第一种情况下,当浏览器不支持Cookie 功能时,浏览器会将用户的SessionCookieName 重写到用户请求的URL 参数中,它的传递格式如

/path/Servlet;name=value;name2=value2? Name3=value3,其中“Servlet;”后面的K-V 对就是要传递的Path Parameters,服务器会从这个Path Parameters 中拿到用户配置的SessionCookieName。关于这个SessionCookieName,如果你在web.xml 中配置session-config 配置项的话,其cookie-config 下的name 属性就是这个SessionCookieName 值,如果你没有配置session-config 配置项,默认的SessionCookieName 就是大家熟悉的“JSESSIONID”。接着Request 根据这个SessionCookieName 到Parameters 拿到Session ID 并设置到

request.setRequestedSessionId 中。

请注意如果客户端也支持Cookie 的话,Tomcat 仍然会解析Cookie 中的Session ID,并会覆盖URL 中的Session ID。

如果是第三种情况的话将会根据javax.servlet.request.ssl_session 属性值设置Session ID。

有了Session ID 服务器端就可以创建HttpSession 对象了,第一次触发是通过request. getSession() 方法,如果当前的Session ID 还没有对应的HttpSession 对象那么就创

建一个新的,并将这个对象加到org.apache.catalina. Manager 的sessions 容器中保存,Manager 类将管理所有Session 的生命周期,Session 过期将被回收,服务器关闭,Session 将被序列化到磁盘等。只要这个HttpSession 对象存在,用户就可以根据Session ID 来获取到这个对象,也就达到了状态的保持。

还有一点与Session 关联的Cookie 与其它Cookie 没有什么不同,这个配置的配置可以通过web.xml 中的session-config 配置项来指定。

4.session中的一些问题

(1)、session在何时被创建

一个常见的误解是以为session在有客户端访问时就被创建,然而事实是直到某server 端程序调用HttpServletRequest.getSession(true)这样的语句时才被创建,注意如果JSP

没有显示的使用<%@page session="false"%> 关闭session,则JSP文件在编译成Servlet 时将会自动加上这样一条语句HttpSession session = HttpServletRequest.getSession(true);这也是JSP中隐含的session对象的来历。

由于session会消耗内存资源,因此,如果不打算使用session,应该在所有的JSP中关闭它。

(2)、session何时被删除

综合前面的讨论,session在下列情况下被删除a.程序调用HttpSession.invalidate();

或b.距离上一次收到客户端发送的session id时间间隔超过了session的超时设置;或c.服务器进程被停止(非持久session)

(3)、如何做到在浏览器关闭时删除session

严格的讲,做不到这一点。可以做一点努力的办法是在所有的客户端页面里使用网页特效代码window.onclose来监视浏览器的关闭动作,然后向服务器发送一个请求来删

除session。但是对于浏览器崩溃或者强行杀死进程这些非常规手段仍然无能为力。(4)、有个HttpSessionListener是怎么回事

你可以创建这样的listener去监控session的创建和销毁事件,使得在发生这样的事件时你可以做一些相应的工作。注意是session的创建和销毁动作触发listener,而不是相反。类似的与HttpSession有关的listener还有HttpSessionBindingListener,HttpSessionActivationListener和HttpSessionAttributeListener。

(5)、存放在session中的对象必须是可序列化的吗

不是必需的。要求对象可序列化只是为了session能够在集群中被复制或者能够持久保存或者在必要时server能够暂时把session交换出内存。在Weblogic Server的session 中放置一个不可序列化的对象在控制台上会收到一个警告。我所用过的某个iPlanet版本如果session中有不可序列化的对象,在session销毁时会有一个Exception,很奇怪。(6.)、如何才能正确的应付客户端禁止cookie的可能性

对所有的URL使用URL重写,包括超链接,form的action,和重定向的URL,具体做法参见[6]https://www.sodocs.net/doc/be13648884.html,/wls/docs70/webapp/sessions.html#100770

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

参见第三小节对cookie的讨论,对session来说是只认id不认人,因此不同的浏览器,不同的窗口打开方式以及不同的cookie存储方式都会对这个问题的答案有影响。

(8.)、如何防止用户打开两个浏览器窗口操作导致的session混乱

这个问题与防止表单多次提交是类似的,可以通过设置客户端的令牌来解决。就是在服务器每次生成一个不同的id返回给客户端,同时保存在session里,客户端提交表单时必须把这个id也返回服务器,程序首先比较返回的id与保存在session里的值是否一致,如

果不一致则说明本次操作已经被提交过了。可以参看《J2EE核心模式》关于表示层模式的部分。需要注意的是对于使用javascript window.open打开的窗口,一般不设置这个id,或者使用单独的id,以防主窗口无法操作,建议不要再window.open打开的窗口里做修改操作,这样就可以不用设置。

(9.)、为什么在Weblogic Server中改变session的值后要重新调用一次

session.setValue做这个动作主要是为了在集群环境中提示Weblogic Server session中的值发生了改变,需要向其他服务器进程复制新的session值。

(10)、为什么session不见了

排除session正常失效的因素之外,服务器本身的可能性应该是微乎其微的,虽然笔者在iPlanet6SP1加若干补丁的Solaris版本上倒也遇到过;浏览器插件的可能性次之,笔者也遇到过3721插件造成的问题;理论上防火墙或者代理服务器在cookie处理上也有可能会出现问题。

出现这一问题的大部分原因都是程序的错误,最常见的就是在一个应用程序中去访问另外一个应用程序。

关于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

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安全了。

深入理解ServletJSP之Cookie和Session原理

由于H T T P协议的无状态特征,W e b应用中经常使用C o o k i e和S e s s i o n来保存用户在与系统交互过程中的状态数据。下面通过分析H T T P协议对C o o k i e和S e s s i o n的工作原理加以了解。 一、C o o k i e C o o k i e的含义是“服务器送给浏览器的甜点”,即服务器在响应请求时可以将一些数据以“键-值”对的形式通过响应信息保存在客户端。当浏览器再次访问相同的应用时,会将原先的C o o k i e通过请求信息带到服务器端。 下面的S e r v l e t展示了C o o k i e的功能。 ......... p u b l i c v o i d d o G e t(H t t p S e r v l e t R e q u e s t r e q u e s t,H t t p S e r v l e t R e s p o n s e r e s p o n s e) t h r o w s S e r v l e t E x c e p t i o n,I O E x c e p t i o n{ r e s p o n s e.s e t C o n t e n t T y p e("t e x t/h t m l"); P r i n t W r i t e r o u t=r e s p o n s e.g e t W r i t e r(); S t r i n g o p t i o n=r e q u e s t.g e t P a r a m e t e r("o p t i o n"); i f("s h o w".e q u a l s(o p t i o n)){ //获得请求信息中的C o o k i e数据 C o o k i e[]c o o k i e s=r e q u e s t.g e t C o o k i e s(); i f(c o o k i e s!=n u l l){ //找出名称(键)为“c o o l”的C o o k i e f o r(i n t i=0;i"+c o o k i e s[i].g e t N a m e()+":" +c o o k i e s[i].g e t V a l u e()+""); } } } }e l s e i f("a d d".e q u a l s(o p t i o n)){ //创建C o o k i e对象 C o o k i e c o o k i e=n e w C o o k i e("c o o l","y e a h!"); //设置生命周期以秒为单位 c o o k i e.s e t M a x A g e(20); //添加C o o k i e r e s p o n s e.a d d C o o k i e(c o o k i e); }

APPlication,Session和Cookie的区别

APPlication,Session 和Cookie 的区别 方法信息量大小 保存时间应用范围保存位置 Application 任意大小整个应用程序的生命期 所有用户服务器端Session 小量,简单的数据用户活动时间+一段延迟时间(一般为20分钟) 单个用户服务器端Cookie 小量,简单的数据可以根据需要设定 单个用户客户端1.Application 对象 Application 用于保存所有用户的公共的数据信息,如果使用Application 对象,一个需要考虑的问题是任何写操作都要在Application_OnStart 事件(global.asax)中完成.尽管使用Application.Lock 和Applicaiton.Unlock 方法来避免写操作的同步,但是它串行化了对Application 对象的请求,当网站访问量大的时候会产生严重的性能瓶颈.因此最好不要用此对象保存大的数据集合 2.Session 对象 Session 用于保存每个用户的专用信息.她的生存期是用户持续请求时间再加上一段时间(一般是20分钟左右).Session 中的信息保存在Web 服务器内容中,保存的数据量可大可小.当Session 超时或被关闭时将自动释放保存的数据信息.由于用户停止使用应用程序后它仍然在内存中保持一段时间,因此使用Session 对象使保存用户数据的方法效率很低.对于小量的数据,使用Session 对象保存还是一个不错的选择.使用Session 对象保存信息的代码如下:// 存放信息Session["username"]="zhouhuan";//读取数据string UserName=Session["username"].ToString(); 3.Cookie 对象 Cookie 用于保存客户浏览器请求服务器页面的请求信息,程序员也可以用它存放非敏感性的用户信息,信息保存的时间可以根据需要设置.如果没有设置Cookie 失效日期,它们仅保存到关闭浏览器程序为止.如果将Cookie 对象的Expires 属性设置为Minvalue,则表示Cookie 永远不会过期.Cookie 存储的数据量很受限制,大多数浏览器支持最大容量为4096,因此不要用来保存数据集及其他大量数据.由于并非所有的浏览器都支持Cookie,并且数据信息是以明文文本的形式保存在客户端的计算机中,因此最好不要保存敏感的,未加密的数据,否则会影响网站的安全

java web之会话技术cookie+session

会话技术 1.什么是会话: 指用户开一个浏览器,访问一个网站,只要不关闭该浏览器,不管该用户点击多少个超链接、访问多少个资源,直到用户关闭浏览器,整个这个过程我们成为一次会话 2.实际情况: 张三打开浏览器,进入淘宝,买了2样东西;李四打开浏览器,进入淘宝,买了3样东西。当这两位结账时,结账的s e r v l e t如何得到张三和李四买的东西,并为他两分别结账? 3.使用会话保存数据 ?S e s s i o n ?C o o k i e 为什么需要C o o k i e? 情景1.张在访问某个网站的时候,看到了提示你上次登录网站的时间,而且不同用户上次登录时间不同,这个怎么实现 没有会话技术前:u s e r表每次用户登录就更新u s e r表里的时间 I d N a m e P a s s w o r d L o g i n_t i m e v i e w H i s t o r y 001A a A a2012-1-5 5:00:0022,33,2 5 002B b B b2012-3-12 6:00:0012,24,5 6 情景2.访问购物网的时候,能够看到曾经浏览过的商品,当然不同用户浏览过的商品不同 如果登录了,则可以用数据库 但如果没有登录那又怎么办?????? 情景3.保存登录密码及用户名 Cookie技术 1.服务器把每个用户的数据以cookie的形式写给用户各自的浏览器当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去 Servlet有一个Cookie类 Cookie(String name ,String value) 3.Cookie小结: ①Cookie在服务端创建 Cookie cookie = new Cookie(name,value); ②Cookie是保存在浏览器这端 response.addCookie(cookie); ③Cookie的生命周期可以通过cookie.setMaxAge(int second)来设置 Cookie默认生命周期是会话级别(即存储在浏览器的内存中) 如果没有设置setMaxAge(),则该cookie的生命周期当浏览器关闭时就挂了,setMaxAge(0) +response.addCookie(cookie),相当于删除Cookie 此时如果cookie文件内部只有该Cookie则,文件也一并删除;否则只删除该Cookie ④Cookie可以被多个浏览器共享

几种session存储方式比较

几种session存储方式比较 1. 客户端cookie加密 这是我以前采用的方式,简单,高效。比较好的方法是自己采用cookie机制来实现一个session,在应用中使用此session实现。 问题:session中数据不能太多,最好只有个用户id。 参考实现:https://www.sodocs.net/doc/be13648884.html, 2. application server的session复制 可能大部分应用服务器都提供了session复制的功能来实现集群,tomcat,jboss,was都提供了这样的功能。 问题: 性能随着服务器增加急剧下降,而且容易引起广播风暴; session数据需要序列化,影响性能。 如何序列化,可以参考对象的序列化和反序列化. 参考资料 Tomcat 5集群中的SESSION复制一 Tomcat 5集群中的SESSION复制二 应用服务器-JBoss 4.0.2集群指南 3. 使用数据库保存session 使用数据库来保存session,就算服务器宕机了也没事,session照样在。 问题: 程序需要定制; 每次请求都进行数据库读写开销不小(使用内存数据库可以提高性能,宕机就会丢失数据。可供选择的内存数据库有BerkeleyDB,MySQL的内存表); 数据库是一个单点,当然可以做数据库的ha来解决这个问题。 4. 使用共享存储来保存session 和数据库类似,就算服务器宕机了也没事,session照样在。使用nfs或windows文件共享都可以,或者专用的共享存储设备。 问题: 程序需要定制; 频繁的进行数据的序列化和反序列化,性能是否有影响; 共享存储是一个单点,这个可以通过raid来解决。 5. 使用memcached来保存session 这种方式跟数据库类似,不过因为是内存存取的,性能自然要比数据库好多了。 问题: 程序需要定制,增加了工作量; 存入memcached中的数据都需要序列化,效率较低; memcached服务器一死,所有session全丢。memchached能不能做HA 我也不知道,网站上没提。 参考资料 应用memcached保存session会话信息 正确认识memcached的缓存失效 扩展Tomcat 6.x,使用memcached存放session信息 6. 使用terracotta来保存session

c#下使用cookie和session

c#如何记住用户的信息 记录加密之后的信息,确保用户的信息安全 使用cookie和session记录用户的信息 1、保存时间 session的默认保存时间是24分钟 cookie在没有设置的情况下关闭之后立即结束生命周期 设置cookie的时间,cookie-name.Expires=Date.Now.AddDays();/DateTime.MaxValue;(永久) C#读取设置Cookie 设置: HttpCookie cookie = new HttpCookie("cookieName"); cookie.Value = "name1" HttpContext.Current.Response.Cookies.Add(cookie); 读取: HttpContext.Current.Request.Cookies["cookieName"].Value 判断cookie是否存在: if(HttpContext.Current.Request.Cookies["cookieName"]==null){ //do something } 设置cookie有效期 cookie.Expires = DateTime.Now.AddDays(1); https://www.sodocs.net/doc/be13648884.html,中Cookies的用法(转) 一,cookies 写入 方法1: Response.Cookies["username"].Value="gjy"; Response.Cookies["username"].Expires=DateTime.Now.AddDays(1); 方法2: System.Web.HttpCookie newcookie=new HttpCookie("username"); newcookie.Value="gjy"; newcookie.Expires=DateTime.Now.AddDays(1); Response.AppendCookie(newcookie); 创建带有子键的cookies: System.Web.HttpCookie newcookie=new HttpCookie("user"); newcookie.Values["username"]="gjy"; newcookie.Values["password"]="111";

Cookie和Session的作用和工作原理

一、Cookie详解 (1)简介 因为HTTP协议是无状态的,即服务器不知道用户上一次做了什么,这严重阻碍了交互式Web应用程序的实现。在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两饮料。最后结帐时,由于HTTP的无状态性,不通过额外的手段,服务器并不知道用户到底买了什么。为了做到这点,就需要使用到Cookie了。服务器可以设置或读取Cook ies中包含信息,借此维护用户跟服务器会话中的状态。 Cookie(复数形态:Cookies),是指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。 Cookie是由服务端生成的,发送给客户端(通常是浏览器)的。Cookie总是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie: 内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短暂的。 硬盘Cookie保存在硬盘里,有一个过期时间,除非用户手工清理或到了过期时间,硬盘Cookie不会被删除,其存在时间是长期的。所以,按存在时间,可分为非持久Cookie和持久Cookie。 (2)工作原理 1、创建Cookie 当用户第一次浏览某个使用Cookie的网站时,该网站的服务器就进行如下工作: ①该用户生成一个唯一的识别码(Cookie id),创建一个Cookie对象; ②默认情况下它是一个会话级别的cookie,存储在浏览器的内存中,用户退出浏览器之后被删除。如果网站希望浏览器将该Cookie存储在磁盘上,则需要设置最大时效(maxAge),并给出一个以秒为单位的时间(将最大时效设为0则是命令浏览器删除该Cookie); ③将Cookie放入到HTTP响应报头,将Cookie插入到一个Set-Cookie HTTP请求报头中。 ④发送该HTTP响应报文。 2、设置存储Cookie 浏览器收到该响应报文之后,根据报文头里的Set-Cookied特殊的指示,生成相应的Cookie,保存在客户端。该Cook ie里面记录着用户当前的信息。 3、发送Cookie 当用户再次访问该网站时,浏览器首先检查所有存储的Cookies,如果某个存在该网站的Cookie(即该Cookie所声明的作用范围大于等于将要请求的资源),则把该cookie附在请求资源的HTTP请求头上发送给服务器。 4、读取Cookie 服务器接收到用户的HTTP请求报文之后,从报文头获取到该用户的Cookie,从里面找到所需要的东西。 (3)作用 Cookie的根本作用就是在客户端存储用户访问网站的一些信息。典型的应用有: 1、记住密码,下次自动登录。 2、购物车功能。 3、记录用户浏览数据,进行商品(广告)推荐。 (4)缺陷 ①Cookie会被附加在每个HTTP请求中,所以无形中增加了流量。 ②由于在HTTP请求中的Cookie是明文传递的,所以安全性成问题。(除非用HTTPS) ③Cookie的大小限制在4KB左右。对于复杂的存储需求来说是不够用的。 二、Session详解 (1)简介 Session代表服务器与浏览器的一次会话过程,这个过程是连续的,也可以时断时续的。Session是一种服务器端的机制,Session 对象用来存储特定用户会话所需的信息。 Session由服务端生成,保存在服务器的内存、缓存、硬盘或数据库中。

深入理解Session,cookie

深入理解Servlet/JSP之“Cookie和Session原理” (2008-06-29 13:41:09) 转载 标签:it it培训 java jsp servlet session cookie session持久化 由于HTTP协议的无状态特征,Web应用中经常使用Cookie和Session来保存用户在与系统交互过程中的状态数据。下面通过分析HTTP协议对Cookie和Session的工作原理加以了解。 一、Cookie Cookie的含义是“服务器送给浏览器的甜点”,即服务器在响应请求时可以将一些数据以“键-值”对的形式通过响应信息保存在客户端。当浏览器再次访问相同的应用时,会将原先的Cookie通过请求信息带到服务器端。 下面的Servlet展示了Cookie的功能。 ... ... ... public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); String option = request.getParameter("option"); if ("show".equals(option)) { //获得请求信息中的Cookie数据 Cookie[] cookies = request.getCookies(); if (cookies != null) { //找出名称(键)为“cool”的Cookie for (int i = 0; i < cookies.length; i++) { if ("cool".equals(cookies[i].getName())) { out.println("

" + cookies[i].getName() + ":" + cookies[i].getValue() + "

"); } } } } else if ("add".equals(option)) { //创建Cookie对象 Cookie cookie = new Cookie("cool", "yeah!");

页面跳转及Cookie和Session

第十五天课堂笔记 1.页面跳转的两种方式 a)请求转发 i.实现代码: ii.特点: 1.不管转发几次, 只发送一次请求 2.请求携带的数据在转发后还可以继续获取 3.地址栏在多次转发时不会改变 4.转发后的代码还可以继续执行, 但是, 只能转发一 次 5.可以转发给项目内的资源(servlet, 界面…), 但是不 能转发到项目外的资源 b)重定向 i.实现代码 ii.特点 1.重定向一次会发送两次请求 2.因为是两次请求, 所以第一次携带的数据在第二次 请求时就已经无效了, 需要再次携带数据 3.地址栏会发生改变

4.重定向后代码还可以继续执行, 但是, 只能重定向 一次 5.重定向既可以访问内部资源, 也可以访问外部资源 2.ServletContext对象 a)一个应用程序只有一个ServletContext对象, 被所有 Servlet所共享, 因此, 该对象也被称之为Application对象 b)获取ServletContext对象的三种方式: c)ServletContext对象常用的功能 i.获取全局配置信息 1.全局配置信息的定义 2.获取全局配置信息 ii.获取相关路径信息 iii.获取WebRoot下的资源文件

iv.请求转发 3.Cookie a)Cookie是一个类, 它用于存储一些少量的信息, 首先在Servlet 中创建, 然后发送到客户端浏览器进行保存, 在之后的访问服 务器的过程中, 浏览器会自动携带Cookie信息 b)Cookie信息默认存储于浏览器内存中, 关闭浏览器或使用不同 的浏览器, 均无法获取到cookie信息 c)可以通过setMaxAge(seconds)方法给Cookie设置最大存活时间. 设置后, Cookie会保存到本地硬盘中, 到期后自动删除.如果时 间设置为0, cookie会被直接删除. d)可以通过setPath(uri)方法给Cookie设置访问路径, 设置后只有 访问固定路径时, 才会携带Cookie信息

利用FIDDLER工具进行session和cookie欺骗

利用FIDDLER工具进行session和cookie欺骗 Agileone登录捕获: 选中post请求,在内容中修改密码并执行。 将password=admin,改成password=123,显示结果如下: 在textview中,结果反馈为password invalid。 进行session欺骗:把登录后的任意一个请求的sessionIDcopy到登录get请求内容中,结果响应出已经进入到登录后的首页,和首页中的源文件一样。如图,

请求内容: GET http://localhost/agileone/ HTTP/1.1 Host: localhost Connection: keep-alive Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36 Accept-Encoding: gzip, deflate, sdch Accept-Language: zh-CN,zh;q=0.8 Cookie:PHPSESSID=68aa4b8855d4e704dce53b23eb9a5c92;PHPSESSID=4766b699b16758c0ce 8eca2756a3a459; Cookie欺骗操作同理。

对java中cookie和session的一些简介

1 课程回顾 Servlet编程 1)Servlet生命周期(重点) 构造方法:创建servlet对象。默认情况下,第一次访问servlet对象时。只调用1次。 init方法(有参):创建完servlet对象后调用。只调用1次。 注意:会调用无参的init方法。 service方法:servlet提供服务的方法。每次发出请求调用。 注意:request对象,response对象 destroy方法:tomcat服务器停止或web应用重新部署,servlet对象销毁,destroy方法被调用。 2)ServletConfig对象 获取servlet的初始化参数: getInitParameter("name "); getInitParameterNames(); 3)ServletContext对象 得到web应用路径: context.getContextPath(); request.getContextPath(); 等价于上面的代码 得到web应用参数: context.getInitParameter("name"); context.getInitParameterNames(); 域对象: context.setAttribute("name",Object): 保存数据 context.getAttribute("name") 得到数据 context.removeAttribue("name") 清除数据 转发 context.getRequestDispatcher("路径").forward(request,response); request.getRequestDispacher("路径").forward(request,response); 等价于上面的代码得到web应用中的资源文件 context.getRealPath("路径") context.getResourceAsStream("路径"); 今天的目标:会话管理 // 代表java命令运行目录,java运行命令哪里? 服务器启动的目录,tomcat/bin 到底在什么环境下运行,用.在java和entete不一样。Java和tomcat的不一样, 用这个方法, 2. 会话管得到web应用中的资源文件 context.getRealPath("路径") context.getResourceAsStream("路径");

Session四种方式测试报告(ASP&NET)

目录 https://www.sodocs.net/doc/be13648884.html, Session四种方式测试报告 (1) 测试环境 (1) 简介 (1) 默认模式 (1) cookieless模式 (4) 将服务器Session信息存储在进程中 (4) 将服务器Session信息存储在数据库中 (5) 结论 (6) https://www.sodocs.net/doc/be13648884.html, Session四种方式测试报告 版权归属:Top of c# 5885668群风之痕(499905171)原创文章,如果有转载,请保留该句。测试环境 .net 4.0 谷歌浏览器(34.0.1847.116) 简介 SessionState是https://www.sodocs.net/doc/be13648884.html,默认的机制。SessionState有几种模式。InProc,StateServer,SqlServer模式。InProc不支持负载均衡的场景。只有StateServer和SqlServer模式才支持。自定义模式是指我们自己实现Session数据的持久化,比如将Session数据放到Oracle数据库或者MySql数据库中,自定义模式也可以支持负载均衡。在StateServer和SqlServer模式时,放入Session中的数据都必须是能序列化的。建议采用SqlServer模式的Session机制。 默认模式 默认模式下Session会在客户生成一个浏览器的cookie,跟在服务端生成一个内存对象。 因为这种原理,所以当我们清理掉浏览器的cookie,再连接的时候,服务端还会生成一个新的Session对象,如果前个Session还没释放的话,就会有2个对象产生。 下面代码会通过全局文件,去判断Session是否产生,是否释放,产生的话+1,释放-1

https://www.sodocs.net/doc/be13648884.html, Application,Session,Cookie和ViewState等对象用法和区别

https://www.sodocs.net/doc/be13648884.html, Application,Session,Cookie和ViewState等对象用法和区别 在https://www.sodocs.net/doc/be13648884.html,中,有很多种保存信息的内置对象,如:Application,Session,Cookie,ViewState和Cache 等。下面分别介绍它们的用法和区别。 方法 信息量大 小 作用域和保存时间应用范围 保存位 置 Applic ation任意大小整个应用程序的生 命期 整个应用程序/ 所有用户 服务器 端 Cach e 任意大小可以根据需要设定 整个应用程序/ 所有用户 服务器 端 Sessi on 小量,简单 的数据 用户活动时间+一 段延迟时间(一般为20分 钟) 单个用户 服务器 端 Cooki e 小量,简单 的数据 可以根据需要设定单个用户客户端 Views tate 小量,简单 的数据 一个Web页面的生 命期 单个用户客户端 隐藏域 小量,简单 的数据 一个Web页面的生 命期 单个用户客户端 查询字符串 小量,简单 的数据 直到下次页面跳转 请求 单个用户客户端 1.Application对象 Application用于保存所有用户的公共的数据信息,如果使用Application对象,一个需要考虑的问题是任何写操作都要在Application_OnStart事件(global.asax)中完成.尽管使用Application.Lock和Applicaiton.Unlock方法来避免写操作的同步,但是它串行化了对Application对象的请求,当网站访问量大的时候会产生严重的性能瓶颈.因此最好不要用此对象保存大的数据集合. 下面我们做个在线用户统计的例子来说明这个问题:

Cookie和会话状态的工作原理及Cookie欺骗

存在两种类型的cookie: Session cookies - these are temporary and are erased when you close your browser at the end of your surfing session. The next time you visit that particular site it will not recognise you an d will treat you as a completely new visitor as there is nothing in your browser to let the site k now that you have visited before 不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie 就消失了。这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。 Persistent cookies - these remain on your hard drive until you erase them or they expire. How long a cookie remains on your browser depends on how long the visited website has program med the cookie to last 设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。 存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存的cookie,不同的浏览器有不同的处理方式。 Cookie和会话状态的工作原理及Cookie欺骗 session是一种保存上下文信息的机制,它是针对每一个用户的,变量的值保存在服务器端,通过SessionID来区分不同的客户,session是以Cookie或URL重写为基础。默认使用Cookie 来实现,系统会创造一个名为JSESSIONID的输出Cookie,或称为"Session Cookie",以区别Persistent Cookies(通常所说的Cookie).Session Cookie是存储在浏览器中,并不是写在硬盘上的,但是把浏览器的Cookie禁止后,使用response对象的encodeURL或 encodeRedirectURL 方法编码URL,WEB服务器会采URL重写的方式传递Sessionid,用户就可以在地址栏看到 jsessionid=A09JHGHKHU68624309UTY84932之类的字符串。 通常Session Cookie是不能跨窗口使用,当用户新开了一个浏览器进入相同的页面时,系统会赋予用户一个新的SessionID,这样信息共享的目的就达不到,此时可以把SessionID保存在Persistent Cookie中,然后再新的窗口中读出来,就可以得到上一个窗口的SessionID了,这样通过Session Cookie和Persistent Cookie的结合,实现了跨窗口的会话跟踪。 session的工作原理 就session的实现而言,好像是这样的: (1)当有Session启动时,服务器生成一个唯一值,称为SessionID(好像是通过取进程ID的方式取得的)。 (2)然后,服务器开辟一块内存,对应于该SessionID。 (3)服务器再将该SessionID写入浏览器的cookie(一些在网页的源代码中有所体现)。

Session和Cookie的作用以及实现

Session和Cookie的作用以及实现 最近学习Session和Cookie的总结,我发现好多做测试的朋友对这个的理解不是那么透彻;如果理解了Cookie和session的原理和使用,在我们的测试工作中,有很大的帮助;尤其是在接口测试,性能测试中。。。 我把下面的内容做成了一个pdf文档,有需要看的朋友,可以去百度云盘下载,地址在文章的最后: 内容如下: 一、为什么要用Cookie和Session? 很多时候客户端和服务器进行交互使用了HTTP协议,但是HTTP协议是无状态的;HTTP协议的请求过程,是基于TCP/IP 的,当客户端请求服务器,服务器处理后,进行响应,该过程是无状态的。 但是在有些时候是需要保存一些客户端的请求信息,识别客户端的某些状态,智能的、有针对性的去分析某些客户端的习惯。这些时候,就需要去记录客户端的连接状态,识别请求的状态等。所以为了解决类似的事情,就需要使用到了Cookie 和Session。 比如,使用Cookie的场景:有些网站有记住用户名的功能,当你勾这个的时候,下次进入该网站时,就会保存上一次登录的用户名;使用Seesion的场景:利用Seesion来验证用户是否已登录,利用Session来保存验证码。 二、Cookie和Session是什么? (1)Cookie:在客户端访问某个地址时,会将请求交到服务器进行处理,在发送请求的时候,浏览器会将页面的头部信息一并的交到服务器端进行处理。在处理的过程中,Cookie 在服务器端生成,在此同时,可以将一些需要保存的信息,存放到此Cookie 中。生成Cookie 对象时,需要确定具体的名称及具体的值,可以设置当前Cookie 的过期时间,设置过期时间后,就相当于持久化了Cookie 中的数据,此时的Cookie 会以之前的Cookie 名称,保存在客户端。 如果不设置过期时间,则当前Cookie 的生命期是浏览器会话期间,一旦关闭了该浏览器,当前的Cookie 就会不存在了,此时的Cookie 信息是保存在内存中。在服务器端,处理完后,会将生成的Cookie ,随着Http 响应,会在Http 响应头中,加上Cookie 信息,浏览器接受到响应后,会按照Http 响应头里的Cookie ,在客户端建立Cookie 。在下次客户进行请求的时候,Http 会附带着已经存储过的Cookie,一并发送到服务器。一个域,在客户端建立的所以Cookie 都是可以共享的,只要Cookie 没有过期。 (2)Session:Session 是在服务器端生成的,存储在服务器端,即存在内存中。可以对生成的Session 设置过期时间,如果不设置过期时间,默认的Session 过期时间是30 分钟(在不同的服务器中,它的过期时间略有不同,本文是以Tomcat 来说的)但是,Sesssion 的生成的同时,会生成一个与之相关联的的SessionID ,此SessionID 的存储是需要Cookie 来完成的。SessionID 是以名称为JSESSIONID,其值应该是一个既不会重复,又不容易被找到规律以仿造的字符串。SessionID会随着此次Http 响应,一并返回到客户端,并保存在客户端中。到当前请求再次发出后,该SessionID会随着Http 头部,传到服务器中,服务器依据当前SessionID 得到与之对应的Session. 其中:通过Cookie 的方式存储Session 状态,只是其中一种方式。如果客户端禁用了Cookie 的话,很多网站任然可以存储用户的信息。一种处理的方式是URL 重写,将SesseionID 直接附加在请求地址的后面。另一种处理的方式是,使用隐藏自动的方式。就是服务器自动的在表单中,添加一个隐藏字段,以便在表单提交时,将SesseionID 一起传到服务器,进行识别。 (3)总结下:Cookie是存在客户端的,比如我们电脑的本地文件中(设置的过期时间的话),在我本地的话(C:\Users\xxx\AppData\Roaming\Microsoft\Windows\Cookies): 也可以在浏览器中看(chrome): Session是存在服务器端的(我的apche也安装在本地的):

10分钟让你区分Session和Cookie区别

Session Session定义 一般被翻译为‘会话’,具体到Web中的Session指的就是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间。因此从上述的定义中我们可以看到,Session实际上是一个特定的时间概念。 session工作原理 session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(来保存信息。 当客户端请求创建一个session的时候,服务器首先检查客户端请求里是否已包含了一个session标识session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用。 如果客户端请求不包含session id,则为此服务器创建一个session并且生成一个与此session相关联的session id。session id的值是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。保存这个session id的方式可以采用cookie。一般这个cookie的名字都是类似于SEEESIONID。 比如: JSESSIONID=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,它的名字就是JSESSIONID。 由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写。 就是把session id直接附加在URL路径的后面,附加方式也有两种: 1.一种是作为URL路径的附加信息,表现形式为http://...../xxx;jsessionid=ByOK ... 99zWpBng!-145788764 2.另一种是作为查询字符串附加在URL后面,表现形式为http://...../xxx?jsessionid=ByOK ... 99zWpBng!-145788764 这两种方式对于用户来说是没有区别的,只是服务器在解析的时候处理的方式不同,采用第一种方式也有利于把session id的信息和正常程序参数区分开来。 为了在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。 另一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。这种技术现在已较少应用。 有一种一种误解:“只要关闭浏览器,session就消失了”。其实可以想象一下会员卡的例子,除非顾客主动对店家提出销卡,否则店家绝对不会轻易删除顾客的资料。对session 来说也是一样的,除非程序通知服务器删除一个session,否则服务器会一直保留,程序一般都是在用户做log off的时候发个指令去删除session。然而浏览器从来不会主动在关闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭。

Session&Cookie 笔试题及答案

String username = "1234567899"; String regex1 = "^[a-zA-Z0-9]{5,12}$"; String regex2 = "^\\w{1,}[@]\\w{1,}[.]\\w{1,}[.]?\\w{1,}$";//email 写法 String email = "^[a-zA-Z0-9_-]+[@][a-zA-Z0-9_-]+((.com)|(.net))$"; String regex4 = "^\\w{1,}(.com|.cn)$"; String regex3 = "^\\d{3,4}[| -]?\\d{7,8}$";//电话号码,空格不能在最后 String userReg = "^[a-zA-Z0-9_]{5,12}$"; // 用户名5-12位 字母数字,_ String numberReg = "^\\d{6,8}$"; // 6-8位数字 String fpReg = "^[0-9]+[.]?\\d*$"; String telReg = "^(\\d{1,3}[-| ]?)?" + "\\d{3,4}[-| ]?\\d{7,8}[-| ]?(\\d{3,4})?$"; servlet 一、cookie 机制和session 机制的区别 具体来说cookie 机制采用的是在客户端保持状态的方案,而session 机制采用的是在服务器端保持状态的方案。 同时我们也看到,由于在服务器端保持状态的方案在客户端也需要保存一个标识,所以session 机制可能需要借助于cookie 机制来达到保存标识的目的,但实际上还有其他选择。 二、会话cookie 和持久cookie 的区别 如果不设置过期时间,则表示这个cookie 生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie 就消失了。这种生命期为浏览会话期的cookie 被称为会话cookie 。会话cookie 一般不保存在硬盘上而是保存在内存里。 如果设置了过期时间,浏览器就会把cookie 保存到硬盘上,关闭后再次打开浏览器,这些cookie 依然有效直到超过设定的过期时间。 存储在硬盘上的cookie 可以在不同的浏览器进程间共享,比如两个IE 窗口。而对于保存在内存的cookie ,不同的浏览器有不同的处理方式。 三、如何利用实现自动登录 当用户在某个网站注册后,就会收到一个惟一用户ID 的cookie 。客户后来重新连接时,这个用户ID 会自动返回,服务器对它[abc] a 、b 或 c (简单类) [^abc] 任何字符,除了 a 、b 或 c (否定) [a-zA-Z] a 到 z 或 A 到 Z ,两头的字母包括在内(范围) [a-d[m-p]] a 到 d 或 m 到 p :[a-dm-p](并集) [a-z&&[def]] d 、e 或 f (交集) [a-z&&[^bc]] a 到 z ,除了 b 和 c :[ad-z](减去) [a-z&&[^m-p]] a 到 z ,而非 m 到 p :[a-lq-z](减去) \d 数字:[0-9] \D 非数字: [^0-9] \s 空白字符:[ \t\n\x0B\f\r] \S 非空白字符:[^\s] \w 单词字符:[a-zA-Z_0-9] \W 非单词字符:[^\w]

相关主题