搜档网
当前位置:搜档网 › asp中session变量丢失

asp中session变量丢失

asp中session变量丢失
asp中session变量丢失

asp中session变量丢失

我的login页面是这样写的

<%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>

<%

Set rs= Server.CreateObject ("ADODB.RecordSet")

sql = "select * from huiyuan where 用户名= '"&trim(request("a"))&"' and 密码

='"&trim(request("b"))&"'and 是否锁定=0"

rs.open sql, con,3,3

if rs.eof then

response.write""

response.End()

end if

session("loginuser")=rs("用户名")

session("loginname")=rs("姓名")

rs("最近时间")=date()

rs("登入次数")=rs("登入次数")+1

rs.update

response.Redirect("huiyuan/default.asp")

%>

进入会员页面后我都用

<%Set rsa= Server.CreateObject ("ADODB.RecordSet")

sql = "select * from huiyuan where 用户名='"+session("loginuser")+"'"

rsa.open sql, con,3,3 %>来创建记录集

但是为什么我在登入的时候回记录集需要当前记录,我怀疑是session丢失

但是你刷新一遍又好了,在连接一遍又不行了,很不稳定,顺便说一下,我登入后的页面是用的框架集,左边点击相应的项目,右边现实具体内容;但是为什么session一回起作用,一会儿又没有作用了呢?高手指教,在线等待A

问题补充:

我是写了<%=session("loginuser")"%>来提示哪位会员登入,可是就是有时候不行,不能现实,session丢失,我想问问什么丢失了啊!在线交谈,或者qq275467007,候您

最佳答案

session有没有丢失你把session输出不就知道了

在huiyuan/default.asp中写一句<%=session("loginuser")"%>看看是不是为空.

你那句代码建议你这样写

set rsa=server.createobject("adodb.recordset")

sql="select * from huiyuan where 用户名='"&session("loginuser")&"'"

rsa.open sql,conn,1,3

Session丢失问题解决方案-ASP教程,ASP应用

session丢失已经是一种习以为常的问题了,在自己也了解一些如何解决的问题,但是也一直没有机会去用,现在由于新的项目要在b/s下开发,所以不得不让我考虑session的问题。

解决session丢失的问题有两种方法:1)将session保存在一台sate server中。2)将session 保存在sql server中。我们使用的数据库是oracle,不想再装一个数据库,所以用了第一种方法。

首先根据网上查的资料对webconfig文件中session部分进行修改。如下:

mode="stateserver"

cookieless="false"

timeout="240"

stateconnectionstring="tcpip=10.164.222.122:42424"

statenetworktimeout="14400"

/>

validationkey="78ae3850338bfadce59d8ddf58c9e4518e7510149c46142d7aad7f1ad49d95d4" decryptionkey="5fc88dfc24ea123c"

validation="sha1"

/>

然后再在10.164.222.122 这台电脑上的https://www.sodocs.net/doc/206200796.html, state server 服务启动

这样基本上就行了。体验一下。

我用了一个测试程序,在3个小时以后session仍然可用,更绝的是我的电脑都重起了,在其它电脑上打开的网页中session仍然可用。一番体验以后,感觉还真不错。

.net framework 常规参考

元素

为当前应用程序配置会话状态设置。

cookieless="true|false"

timeout="number of minutes"

stateconnectionstring="tcpip=server:port"

sqlconnectionstring="sql connection string"

statenetworktimeout="number of seconds"/>

必选属性

属性选项说明

mode 指定在哪里存储会话状态。

off 指示会话状态未启用。

inproc 指示在本地存储会话状态。

stateserver 指示在远程计算机上存储会话状态。

sqlserver 指示在sql server 上存储会话状态。

可选属性

属性选项说明

cookieless 指定不具有cookie 的会话是否应用于标识客户端会话。

true 指示应使用不具有cookie 的会话。

false 指示不应使用没有cookie 的会话。默认值为false。

timeout 指定在放弃一个会话前该会话可以处于空闲状态的分钟数。默认值为20。stateconnectionstring 指定远程存储会话状态的服务器名称和端口。例如

“tcpip=127.0.0.1:42424”。当mode 为stateserver 时该属性是必需的。sqlconnectionstring 为sql server 指定连接字符串。例如“data source=localhost;integrated security=sspi;initial catalog=northwind”。当mode 为sqlserver 时该属性是必需的。statenetworktimeout 在使用stateserver 模式存储会话状态时,指定在放弃会话之前web 服务器和状态服务器之间的tcp/ip 网络连接空闲的时间(以秒为单位)。默认值为10。

备注

使用stateserver 模式

确保运行https://www.sodocs.net/doc/206200796.html, 状态服务的服务器是要存储会话状态信息的远程服务器。该服务与https://www.sodocs.net/doc/206200796.html, 一起安装,其默认位置为<驱动器>:\systemroot\https://www.sodocs.net/doc/206200796.html,\framework\version\aspnet_state.exe。在应用程序的web.config 文件中,设置mode=stateserver 并设置stateconnectionstring 属性。例如,stateconnectionstring="tcpip=sarath:42424"。

使用sqlserver 模式

在运行sql server 的计算机(它将存储会话状态)上运行installsqlstate.sql(默认的安装位置为<驱动器>:\systemroot\https://www.sodocs.net/doc/206200796.html,\framework\version)。这将创建一个名为aspstate 的数据库,该数据库具有新的存储过程并且在tempdb 数据库中具有aspstatetempapplications 表和aspstatetempsessions 表。

在应用程序的web.config 文件中,设置mode=sqlserver 并设置sqlconnectionstring 属性。例如,sqlconnectionstring="data source=localhost;integrated security=sspi;initial

catalog=northwind"。

示例

以下示例指定若干会话状态配置设置。

cookieless="true"

timeout="20"/>

要求

包含于:

web 平台:iis 5.0、iis 5.1、iis 6.0

配置文件:machine.config、web.config

配置节处理程序:system.web.sessionstate.sessionstatesectionhandler

请参见

https://www.sodocs.net/doc/206200796.html, 配置| https://www.sodocs.net/doc/206200796.html, 设置架构| sessionstatemodule

作者:来源: (责任编辑:webjx) ----------------------------------------------------------收集之二

-----------------------------------------------------------------

在windows2003的服务器中的iis6加入了应用程序池来回收一些无用的进程的功能,当由于网站程序的错误或访问量太多的导致的应用程序池会自动回收该进程,防止网站进入“死机”状态,而这时候的应用程序池的回收就会导致session变量被清除,就出现了session变量不见的现象。

为了解决这种在windows2003下才出现的问题,我们在服务端起动https://www.sodocs.net/doc/206200796.html, state service服务,并且在系统的machine.config做了一些改动。现在默认的情况下会话状态mode是stateserver。如果您的网站根目录下也配有一个web.config配置文件,请把mode="inproc"改成mode="stateserver",如下代码,就可以防止session变量的丢失:

mode="stateserver"

stateconnectionstring="tcpip=127.0.0.1:42424"

sqlconnectionstring="data source=127.0.0.1;integrated security=sspi"

cookieless="false"

timeout="30"

/>

+ 注:只适用于支持https://www.sodocs.net/doc/206200796.html,的用户。

session丢失引发的思考(https://www.sodocs.net/doc/206200796.html,)

这学期,我在参加一个研究性学习。开始我们小组一共有3个同学,没过多久就剩下我一个人了。我们做的是一个“教务网管理系统”,同组的两个同学以“不知道怎么做”为理由推出了这个研究性学习,所以这个项目全部都是我一个人做的。

因为我是一个初学者,所以我边学边做,只要学到什么新的东西,我就在项目中用它。即使不是很合理,我也依然用。我刚开始接触了Session这个东西,我刚开始用它统计网站在线人数,后来我用它传值(从session中读取需要的信息),再后来我用session做身份验证(在页面的Page_Load 事件中,试图从从服务器读取当前的Session,如果session里面的值为空,我就断定非法登陆,就将用户重定向到登陆页面)。之前开发的时候,偶尔会出一些诸如数据读取失败的错误,我也没有怎么在意。后来,我尽量把页面的逻辑变得简单,我用了母版页,只在母版板页的Page_Load 事件中做身份验证,但是有时候还会出一些莫名其妙的问题。最近才知道,session会由于一些原因丢失。

Session丢失的原因如下:

原因1:

bin目录中的文件被改写,https://www.sodocs.net/doc/206200796.html,有一种机制,为了保证dll重新编译之后,系统正常运行,它会重新启动一次网站进程,这时就会导致Session丢失,所以如果有access数据库位于bin目录,或者有其他文件被系统改写,就会导致Session丢失

原因2:

文件夹选项中,如果没有打开“在单独的进程中打开文件夹窗口”,一旦新建一个窗口,系统可能认为是新的Session会话,而无法访问原来的Session,所以需要打开该选项,否则会导致Session丢失

原因3:

似乎大部分的Session丢失是客户端引起的,所以要从客户端下手,看看cookie有没有打开

原因4:

Session的时间设置是不是有问题,会不会因为超时造成丢失

原因5:

IE中的cookie数量限制(每个域20个cookie)可能导致session丢失

原因6:

使用web garden模式,且使用了InProc mode作为保存session的方式

解决Session丢失的经验

1. 判断是不是原因1造成的,可以在每次刷新页面的时候,跟踪bin中某个文件的修改时间

2. 做Session读写日志,每次读写Session都要记录下来,并且要记录SessionID、Session值、所在页面、当前函数、函数中的第几次Session操作,这样找丢失的原因会方便很多

3. 如果允许的话,建议使用state server或sql server保存session,这样不容易丢失

4. 在global.asa中加入代码记录Session的创建时间和结束时间,超时造成的Session丢失是可以在SessionEnd中记录下来的。

5. 如果有些代码中使用客户端脚本,如javascript维护Session状态,就要尝试调试脚本,是不是因为脚本错误引起Session丢失

后来,我又想想:为什么传值一定要用Session呢?难道没有更好的传值的方法?在网上查了好多资料,才知道还有以下这些方法在不同的页面之间传值:

https://www.sodocs.net/doc/206200796.html,跨页面传值技巧:

1. 使用QueryString变量

QueryString是一种非常简单的传值方式,他可以将传送的值显示在浏览器的地址栏中。如果是传递一个或多个安全性要求不高或是结构简单的数值时,可以使用这个方法。但是对于传递数组或对象的话,就不能用这个方法了。下面是一个例子:

a.aspx的C#代码

private void Button1_Click(object sender, System.EventArgs e)

{

string s_url;

s_url = "b.aspx?name=" + Label1.Text;

Response.Redirect(s_url);

}

b.aspx中C#代码

private void Page_Load(object sender, EventArgs e)

{

Label2.Text = Request.QueryString["name"];

}

2. 使用Application 对象变量

Application对象的作用范围是整个全局,也就是说对所有用户都有效。其常用的方法用Lock

和UnLock。

a.aspx的C#代码

private void Button1_Click(object sender, System.EventArgs e)

{

Application["name"] = Label1.Text;

Server.Transfer("b.aspx");

}

b.aspx中C#代码

private void Page_Load(object sender, EventArgs e)

{

string name;

Application.Lock();

name = Application["name"].ToString();

Application.UnLock();

}

3. 使用Session变量

想必这个肯定是大家使用中最常见的用法了,其操作与Application类似,作用于用户个人,所以,过量的存储会导致服务器内存资源的耗尽。

a.aspx的C#代码

private void Button1_Click(object sender, System.EventArgs e)

{

Session["name"] = Label.Text;

}

b.aspx中C#代码

private void Page_Load(object sender, EventArgs e)

{

string name;

name = Session["name"].ToString();

}

4. 使用Cookie对象变量

这个也是大家常使用的方法,与Session一样,其是什对每一个用户而言的,但是有个本质的区别,即Cookie是存放在客户端的,而session是存放在服务器端的。而且Cookie的使用要配合https://www.sodocs.net/doc/206200796.html, 内置对象Request来使用。

a.aspx的C#代码

private void Button1_Click(object sender, System.EventArgs e)

{

HttpCookie cookie_name = new HttpCookie("name");

cookie_name.Value = Label1.Text;

Reponse.AppendCookie(cookie_name);

Server.Transfer("b.aspx");

}

b.aspx中C#代码

private void Page_Load(object sender, EventArgs e)

{

string name;

name = Request.Cookie["name"].Value.ToString();

}

5. 使用Server.Transfer方法

这个才可以说是面象对象开发所使用的方法,其使用Server.Transfer方法把流程从当前页面引导到另一个页面中,新的页面使用前一个页面的应答流,所以这个方法是完全面象对象的,简洁有效。

a.aspx的C#代码

public string Name

{

get{ return Label1.Text;}

}

private void Button1_Click(object sender, System.EventArgs e)

{

Server.Transfer("b.aspx");

}

b.aspx中C#代码

private void Page_Load(object sender, EventArgs e)

{

a newWeb; //实例a窗体

newWeb = (source)Context.Handler;

string name;

name = https://www.sodocs.net/doc/206200796.html,;

}

还有,为什么还要像asp一样使用session进行身份验证呢?https://www.sodocs.net/doc/206200796.html,里面不是有好几种身份验证模式吗?Windows验证、Forms验证、Passport验证,这些身份验证的使用是通过配置Web.config文件的< Authentication >配置节来实现的.

使用 StateServer 保存 Session 解决 Session过期,登陆过期问题。

Post by dazix, 2009-10-12, Views:976

使用StateServer 保存Session 正常操作情况下Session会无故丢失。因为程序是在不停的被操作,排除Session超时的可能。另外,Session超时时间被设定成60分钟,不会这么快就超时的。

原因:由于https://www.sodocs.net/doc/206200796.html,程序是默认配置,所以Web.Config文件中关于Session的设定如下:

cookieless='true' timeout='60'/>

在sessionState标签中有个属性mode,它可以有3种取值:InProc、StateServer、SQLServer(大小写敏感)。默认情况下是InProc,也就是将Session保存在进程内(IIS5是aspnet_wp.exe,而IIS6是W3wp.exe),这个进程不稳定,在某些事件发生时,进程会重起,所以造成了存储在该进程内的Session丢失。

哪些情况下该进程会重起呢?微软的一篇文章告诉了我们:

1、配置文件中processModel标签的memoryLimit属性

2、Global.asax或者Web.config文件被更改

3、Bin文件夹中的Web程序(DLL)被修改

4、杀毒软件扫描了一些.config文件。

解决办法:

前面说到的sessionState标签中mode属性可以有三个取值,除了InProc之外,还可以为StateServer、SQLServer。这两种存Session的方法都是进程外的,所以当aspnet_wp.exe重起的时候,不会影响到Session。

现在请将mode设定为StateServer。StateServer是本机的一个服务,可以在系统服务里看到服务名为https://www.sodocs.net/doc/206200796.html, State Service的服务,默认情况是不启动的。当设定mode为StateServer之后,手工将该服务启动。

这样,就能利用本机的StateService来存储Session了,除非电脑重启或者StateService崩掉,否则Session是不会丢的(因Session超时被丢弃是正常的)。

除此之外,还可以将Session通过其他电脑的StateService来保存。具体的修改是这样的。同样还在sessionState标签中,有个

stateConnectionString='tcpip=127.0.0.1:42424'属性,其中有个ip地址,默认为本机(127.0.0.1),可以将其改成你所知的运行了StateService服务的电脑IP,这样就可以实现位于不同电脑上的https://www.sodocs.net/doc/206200796.html,程序互通Session了。

如果你有更高的要求,需要在服务期重启时Session也不丢失,可以考虑将mode 设定成SQLServer,同样需要修改sqlConnectionString属性。关于使用SQLServer保存Session的操作,请访问这里。

在使用StateServer或者SQLServer存储Session时,所有需要保存到Session的对象除了基本数据类型(默认的数据类型,如int、string等)外,都必须序列化。只需将[Serializable]标签放到要序列化的类前就可以了。

如:

[Serializable]

public class MyClass

{

......

}

https://www.sodocs.net/doc/206200796.html, 使用mode="InProc"方式保存Session老是丢失,无奈改成StateServer 模式。

session是工作在你的应用程序进程中的。https://www.sodocs.net/doc/206200796.html,进程、iis往往会在20分钟之后重启相关的应用程序,缓冲池满了(例如100个之后)也会重启,各种进程保护措施都会随时重新启动,因此InProc方式丢失session是很正常的事。csdn上明确告诉了这种模式只能保存“易失的、暂时的”变量,这是cache没有之前的一种解决方案。而长期保持的数据就要保存在外部数据源中。状态服务器就是一种进程外的数据源。

StateServer 模式的实质是,把Session 存放在一个单独的进程里,此进程独立于aspnet_wp.exe 或 w3wp.exe 。启用此服务后,在“任务管理器”中可以看到一个名为 aspnet_state.exe 的进程,下面开始说明一下设置的具体步骤:

1、修改注册表(关键步骤,如下图)

运行regedit → 打开注册表→ 找到

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state

\Parameters 节点→ 将 AllowRemoteConnection 的键值设置成“1”(1 为允许远程电脑的连接,0 代表禁止)→ 设置 Port (端口号)

注意事项:

a)、若https://www.sodocs.net/doc/206200796.html, State Service 正在运行,修改注册表内容后,则需要重新启动该服务

b)、注意端口号的键值是以十六进制储存的,可以使用十进制进行修改,42424 是默认的端口

c)、AllowRemoteConnection 的键值设置成“1”后,意味着允许远程电脑的连接,也就是说只要知道你的服务端口,就可享用你的https://www.sodocs.net/doc/206200796.html, State Service,即把 Session 存放在你的电脑进程内,因此请大家慎用;键值为“0”时,仅有stateConnectionString 为“tcpip=localhost: 42424”与“tcpip=127.0.0.1:42424”的情况,方可使用https://www.sodocs.net/doc/206200796.html, State Service

2、开启 https://www.sodocs.net/doc/206200796.html, State Service

右键点击“我的电脑”→管理→ 服务与应用程序→ 服务→ 双击“https://www.sodocs.net/doc/206200796.html, State Service” → 启动(可设为“自动”)只要安装了 .Net Framework ,都拥有此服务。

3、更改 Web.config

打开Web.config → 找到 节点内容

stateConnectionString=”tcpip=127.0.0.1:42424″ sqlConnectionString=”data source=127.0.0.1;Trusted_Connection=yes” cookieless=”false”

timeout=”20″ />

→将其改为以下内容

stateConnectionString=”tcpip=192.168.0.2:42424″ timeout=”20″ />

注意事项:

1、timeout=”20″为Session 20分钟超时

2、IP 地址(可以是远程计算机 IP、计算机名称、域名)与端口号,端口号需与https://www.sodocs.net/doc/206200796.html, State Service 的服务端口一致.

aspnet集群中保持session状态

https://www.sodocs.net/doc/206200796.html,集群中保持session状态 https://www.sodocs.net/doc/206200796.html,提供了Session对象,从而允许程序员识别、存储和处理同一个浏览器对象对服务器上某个特定网络应用程序的若干次请求的上下文信息。Session对应浏览器与服务器的同一次对话,在浏览器第一请求网络应用程序的某个页面时,服务器会触发Session_onStart 事件;在对话超时或者被关闭的时候会触发Session_onEnd 事件。程序员可以在代码中响应这两个事件来处理与同一次对话相关的任务,如开辟和释放该次对话要使用的资源等。 在https://www.sodocs.net/doc/206200796.html,的程序中要使用Session对象时,必须确保页面的@page指令中EnableSessionState属性是True或者Readonly,并且在web.config文件中正确的设置了SessionState属性。 https://www.sodocs.net/doc/206200796.html,中Session的状态保持是由web.config文件中的标记下的标记的mode属性来决定的。该属性有四种可能的值:Off、Inproc、StateServer 和SQLServer. 设为Off会禁用Session. Inproc是缺省的设置,这种模式和以前的ASP的会话状态的方法是类似的,会话的状态会被保存在https://www.sodocs.net/doc/206200796.html,进程中,它的优点是显而易见的:性能。进程内的数据访问自然会比夸进程的访问快。然而,这种方法Session的状态依赖于https://www.sodocs.net/doc/206200796.html,进程,当IIS进程崩溃或者正常重起启时,保存在进程中的状态将丢失。 为了克服Inproc模式的缺点,https://www.sodocs.net/doc/206200796.html,提供了两种进程外保持会话状态的方法。 https://www.sodocs.net/doc/206200796.html,首先提供了提供了一个Windows服务:ASPState,这个服务启动后,https://www.sodocs.net/doc/206200796.html,应用程序可以将mode属性设置为“S t ateServer”,来使用这个Windows服务提供的状态管理方法。除了在web.config文件中设置mode属性为StateServer外,还必须设置运行StateServer服务器的IP地址和端口号.如果在IIS所在的机器运行StateServer则IP地址就是127.0.0.1,端口号通常是42424.配置如下: mode=”StateServer” stateConnectionString="tcpip=127.0.0.1:42424" 使用这种模式,会话状态的存储将不依赖IIS进程的失败或者重启,会话的状态将存储在StateServer进程的内存空间中。 另一种会话状态模式是SQLServer模式。这种模式是将会话的状态保存在SQL Server数据库中的。使用这种模式前,必须至少有一台SQL Server服务器,并在服务器中建立需要的表和存储过程。.NET SDK提供了两个脚本来简化这个工作:InstallSqlState.sql和UnInstallSqlState.sql。这两个文件存放在下面路径中: <%SYSTEMDRIVER%>\Winnt\https://www.sodocs.net/doc/206200796.html,\Framework\<%version%>\ 要配置SQL Server 服务器,可以在命令行中运行SQL Server提供的命令行工具osql.exe osql -s [server name] -u [user] -p [password]

Session用法小结

https://www.sodocs.net/doc/206200796.html, Session详解及Session莫名丢失的原因及解决办法 作者:YanJun 日期:2007-07-29 字体大小: 小中大 Session模型简介 Session是什么呢?简单来说就是服务器给客户端的一个编号。当一台WWW服务器运行时,可能有若干个用户浏览正在运正在这台服务器上的网站。当每个用户首次与这台WWW服务器建立连接时,他就与这个服务器建立了一个Session,同时服务器会自动为其分配一个SessionID,用以标识这个用户的唯一身份。这个SessionID是由WWW服务器随机产生的一个由24个字符组成的字符串,我们会在下面的实验中见到它的实际样子。 这个唯一的SessionID是有很大的实际意义的。当一个用户提交了表单时,浏览器会将用户的SessionID自动附加在HTTP头信息中,(这是浏览器的自动功能,用户不会察觉到),当服务器处理完这个表单后,将结果返回给SessionID所对应的用户。试想,如果没有SessionID,当有两个用户同时进行注册时,服务器怎样才能知道到底是哪个用户提交了哪个表单呢。当然,SessionID还有很多其他的作用,我们会在后面提及到。 除了SessionID,在每个Session中还包含很多其他信息。但是对于编写ASP或https://www.sodocs.net/doc/206200796.html,的程序与来说,最有用的还是可以通过访问ASP/https://www.sodocs.net/doc/206200796.html,的内置Session对象,为每个用户存储各自的信息。例如我们想了解一下访问我们网站的用户浏览了几个页面,我们可能在用户可能访问到每个的页面中加入: <% If Session("PageViewed") = ""Then Session("PageViewed") = 1 Else Session("PageViewed") = Session("PageViewed") + 1 End If %> 通过以下这句话可以让用户得知自己浏览了几个页面:

Session对象失效的客户端解决方法

Session对象失效的客户端解决方法 魏莹李锋冯珊 问题的提出 ASP(Active Server Pages)技术的Session对象用于存储用户在对话期间的私有信息。当前用户的Session对象中定义的变量和对象能在页面之间共享,但是不能为应用中其他用户所访问,因此在用ASP开发网络应用程序时,可以利用Session对象保存和跟踪用户的状态信息。 Session对象有一个十分重要的属性:Timeout,它用于设置在会话资源被释放前,会话对象所能保持非活动状态的时间(默认值为20分钟)。当Timeout属性设置的时间值耗尽后,会话资源将被释放。通过Timeout属性破坏Session对象,避免了Session对象在服务器中无限制地产生,保护了服务器资源。但是,在实际网络开发中,常常遇到由于Session对象失效,用户状态信息丢失而导致应用流程无法正常完成的问题。 虽然利用Timeout属性释放资源的策略是出于保护服务器的目的,但是Session对象不可预知的失效性,却成为开发应用程序的一个弊病。因而在实际应用程序的开发中,必须解决Session对象失效的问题。 传统的解决方法 现有的解决方法都是采用服务器端方法解决Session对象失效问题。典型的处理方法分为两大类:失效前的处理和失效后的处理。 失效前的处理是指在Session对象尚未失效之前,对变量进行转存等处理,做到防患于未然。典型的解决方法是在应用程序中设定一个定时器,在Session对象失效前5分钟触发定时器,然后重新设置Session对象的各个变量和对象。由于必须在服务器端实时维护该定时器,并且必须保证该段程序在整个会话过程中处于激活状态,所以采用这种方法增加了服务器的额外负载。 失效后的处理是指在Session对象失效后,立即提示用户进行处理。典型的解决方法是在Session对象失效后,在服务器端保存断点,并提示用户重新登录,继续完成工作。这种方法实现简单,但是往往因为断点的不可完全自动恢复性,以及重新登录过程的复杂性,而受到最终用户的抱怨和指责。 针对以上两类解决方案的缺陷,笔者在编程实践中结合Cookie对象的特性,采用Session 对象与Cookie对象在客户端联合存取会话级变量的方法,既避免了对服务器资源的额外需求,又解决了断点不可自动恢复的问题,而且还免去了重新登录的麻烦。 新的解决方法 Cookie对象是用来存储有关当前用户数据的小信息包,它可以在浏览器和Web服务器之间传递。在Web应用中,Cookie提供了一种用于跟踪、记录每个用户位置的机制。Cookie 最常见的用处之一,就是保存一个Web应用中最后一次被访问的网络页面的时间以及日期或被访问的网址。 通常,Cookie对象在客户端Windows系统目录下Cookies子目录中以文件形式存储。存储在Cookie对象中的信息数据能够被保存较长时间,所以,可以将会话级变量备份在Cookie 对象中,在Session对象失效后,通过检索并利用Cookie对象中的信息来自动恢复断点。Cookie对象具有如下几个属性: ●Expires:设定Cookie对象到期的日期; ●Domain:将Cookie对象的传送确定为仅由Domain属性确定的成员; ●Path:确定Cookie对象传送路径;

session使用方法

session使用方法 在PHP开发中对比起Cookie,session是存储在服务器端的会话,相对安全,并且不像Cookie 那样有存储长度限制,本文简单介绍session的使用。 由于Session 是以文本文件形式存储在服务器端的,所以不怕客户端修改Session 内容。实际上在服务器端的Session 文件,PHP 自动修改session文件的权限,只保留了系统读和写权限,而且不能通过ftp 修改,所以安全得多。PHP China 开源社区门户k%W%e2C Y 对于Cookie 来说,假设我们要验证用户是否登陆,就必须在Cookie 中保存用户名和密码(可能是md5 加密后字符串),并在每次请求页面的时候进行验证。如果用户名和密码存储在数据库,每次都要执行一次数据库查询,给数据库造成多余的负担。因为我们并不能只做一次验证。为什么呢?因为客户端Cookie 中的信息是有可能被修改的。假如你存储$admin 变量来表示用户是否登陆,$admin 为true 的时候表示登陆,为false 的时候表示未登录,在第一次通过验证后将$admin 等于true 存储在Cookie,下次就不用验证了,这样对么?错了,假如有人伪造一个值为true 的$admin 变量那不是就立即取的了管理权限么?非常的不安全。 而Session 就不同了,Session 是存储在服务器端的,远程用户没办法修改session文件的内容,因此我们可以单纯存储一个$admin 变量来判断是否登陆,首次验证通过后设置$admin 值为true,以后判断该值是否为true,假如不是,转入登陆界面,这样就可以减少很多数据库操作了。而且可以减少每次为了验证Cookie 而传递密码的不安全性了(session验证只需要传递一次,假如你没有使用SSL 安全协议的话)。即使密码进行了md5 加密,也是很容易被截获的。 当然使用session还有很多优点,比如控制容易,可以按照用户自定义存储等(存储于数据库)。我这里就不多说了。 session在php.ini 是否需要设置呢?一般不需要的,因为并不是每个人都有修改PHP.ini 的权限,默认session的存放路径是服务器的系统临时文件夹,我们可以自定义存放在自己的文件夹里,这个稍后我会介绍。 开始介绍如何创建session。非常简单,真的。 启动session会话,并创建一个$admin 变量: 如果你使用了Seesion,或者该PHP 文件要调用Session 变量,那么就必须在调用Session 之前启动它,使用session_start() 函数。其它都不需要你设置了,PHP自动完成session文件的创建。

基于springcloud分布式session共享.docx

分布式Session共享 概念 不同进程之间的session共享访问。 解决了分布式系统或者系统集群部署时出现的问题:web容器(如tomcat)管理的session都存放于本地内存中无法共享,用户每次访问的服务器可能都不一样,因此出现服务器不能识别用户、用户登录状态失效等。 解决方案: 方案一:黏性session NGINX等负载均衡网关,可以通过hash映射等方式,保证相同用户的请求会转发到同一台服务器。 优点:简单高效,易实施。 缺点:存在大量请求转发到单点服务器极端情况导致负载均衡失效;单点故障导致用户session丢失。

方案二:tomcat集群session复制 Tomcat提供集群环境下的session复制功能,以达到session共享。 优点:无开发工作量。 缺点:session复制会消耗大量服务器资源,只能应用于小规模的集群。 方案三:Spring session + redis(推荐) Spring session可以接管web容器的session管理,并可以将session 数据存放于redis等第三方存储。 优点:Spring boot/cloud项目无缝集成;可存储海量session数据;可以利用redis提供的持久化保证宕机恢复、服务升级重启用户session不丢失;很好的支持服务在线扩容! 缺点:Spring session没有多语言版本,限制了微服务框架下不同的技术选型。 Spring boot/cloud下的使用方法: 1.增加配置redis和spring session的配置 spring.redis.host=127.0.0.1 spring.redis.password=123456 spring.redis.port=6379

课题_Spring MVC中Session的正确用法之我见

Spring MVC是个非常优秀的框架,其优秀之处继承自Spring本身依赖注入(Dependency Injection)的强大的模块化和可配置性,其设计处处透露着易用性、可复用性与易集成性。优良的设计模式遍及各处,使得其框架虽然学习曲线陡峭,但一旦掌握则欲罢不能。初学者并不需要过多了解框架的实现原理,随便搜一下如何使用“基于注解的controller”就能很快上手,而一些书籍诸如“spring in action”也给上手提供了非常优良的选择。 网上的帖子多如牛毛,中文的快速上手,英文的深入浅出。这样看来,Spring的学习简直是一个轻松愉快的过程。 但是!! 关于Spring中session的使用,大部分资料都讳莫如深。也许这个问题太过容易推断出?大部分资料都没有包括我下面所将要陈述的内容。关于Spring中session的正确使用方法,这里甚至建议直接使用Session。但这种方法显然违背了Spring “technology agnostic” (这个名词我理解意思就是无论你是在什么具体的应用中使用类似的控制逻辑,servlet、一个本地JVM 程序或者其他,你的Controller都可以得到复用)的初衷。 于是我开始从庞大的网络资源和书籍中搜索关于Session的正确用法及Spring MVC处理Session的机制,其中讲得最深入而且清楚的算是这一篇。从上文的内容,及我所查阅的比如官方文档这种资料中,我可以大约推断出几个要点: 1. Spring框架会在调用完Controller之后、渲染View之前检查Model的信息,并把@SessionAttributes()注释标明的属性加入session中 2. @ModelAttribute在声明Controller的参数的时候,可以用来表明此参数引用某个存在在Model中的对象,如果这个对象已经存在于Model中的话(Model可以在调用Controller之前就已经保存有数据,这应该不仅仅因为HandlerInterceptor或者 @ModelAttribute标记的方法已经显式的将一些对象加入到了Model对象中,也因为Spring会默认将一些对象加入到Model中,这一点很重要)。 3. 如果Session中已经存在某个对象,那么可以直接使用ModelAttribute声明Controller的参数,在Controller中可以直接使用它。 其中1很明确,我提到的那篇文章主要就在说明这一点。而从2和3我们也许可以大胆地推出一个结论: Spring会在调用Controller之前将session中的对象填入Model中 因为想从2得到3,这个结论就显得比较自然。那么事实上是不是如此呢?可以做一个小实验。仿效我所引用的那篇文章,我写了如下代码: @Controller @RequestMapping("/user") @SessionAttributes("userId") public class UserController { @RequestMapping(value="/login", method=GET) public String login ( int id, Model model, ServletRequest request, Session session) { model.addAttribute("userId", id); System.out.println("");

《web开发技术(java)》实验四——利用Session完成用户登录功能

《利用Session完成用户登录》 实验指导书 一、实验目的 理解会话对象的功能。 二、实验任务 1、利用会话对象完成用户的模拟登录功能(组织界面输入用户名密码,如果用户名等于neusoft,密码等于123则视作合法用户,并完成登录功能)。登录界面如下: 2、验证用户是否成功登录(如果已经登录显示登录用户信息,否则跳转到登录界面)。 成功登录界面如下:

验证成功登录界面如下: 三、预备知识 1.会话就是驻留服务器上的托管对象,位于JSP容器中。其主要作用是跟踪由一个用户发送的请求。 2.JSP容器与浏览器通过协作使用标准的HTTP协议来实现会话,JSP、Servlet开发人员无需实现会话,也不直接处理会话实现机制。只要能

够使用会话对象即可。 3.获取对象的方法:JSP中直接使用session对象即可,Servlet中需要调用HttpServletRequest实例的getSession()、getSession(flag)方法即可获得。getSession()以及getSession(true)完成的功能是:如果所需的会话不存在,立即创建;getSession(false)完成的功能是:若请求的会话存在,则获取使用,否则返回空值。 4.向会话中添加信息:调用HttpSession实例的setAttribute(String,Object)方法即可将要加的信息添加到Session,但注意如果要添加的属性名同已有的属性名重名,则当前值会覆盖原有的值。 5.获取属性中的信息:调用HttpSession实例的getAttribute(String)方法即可返回需要的值,注意方法的参数为属性的名称。 6.删除属性中的信息:有时根据需要将Session中已有的属性信息予以删除,此时需要调用HttpSession实例的romoveAttribute(String)删除指定的属性。 7.获取会话中所有的属性信息:有时可能根据需要,列出会列出会话中所有的属性值,此时需要调用HttpSession实例的getAttributeNames()方法获取所有的属性名,然后在根据这些属性名分别调用getAttribute(String)方法返回对应的属性值 四、实验步骤 1.创建Web项目 2.创建login.html首页 3.创建完成登录功能的Servlet或JSP

分布式环境下session的存储的几个解决方案已发布

分布式环境下session的存储的几个解决方案企业级应用系统很少是部署在单台服务器上的,这样就带来了跨服务器如何进行session共享的问题,笔者提供了两种方案,分别适用于两种不同场合,持久化session适合于高可靠性的环境,性能上可能有所损坏,而基于memcache 的解决方案相对来说性能较好,但一旦memcache重启,数据丢失。 分布式session之持久化 以mysql举例 1.建立数据库 Sql代码 1.create database session_persistence; 2. https://www.sodocs.net/doc/206200796.html,e session_persistence; 4. 5.create table session( 6. session_id varchar(100) NOT NULL, 7. valid_session char(1) NOT NULL, 8. max_inactive int(11) NOT NULL, 9. last_access bigint(20) NOT NULL, 10. app_name varchar(255) DEFAULT NULL, 11. session_data mediumblob, 12.primary key (session_id), 13.KEY kapp_name (app_name)

14.) engine=InnoDB default charset=utf8; 注:表的字段必须和下面的配置对应 2.配置tomcat的context.xml Xml代码 1. 5. 6.

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/206200796.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";

https://www.sodocs.net/doc/206200796.html, Session详解

https://www.sodocs.net/doc/206200796.html, Session详解 阅读本文章之前的准备 阅读本文章前,需要读者对以下知识有所了解。否则,阅读过程中会在相应的内容上遇到不同程度的问题。 ?懂得ASP/https://www.sodocs.net/doc/206200796.html,编程 ?了解ASP/https://www.sodocs.net/doc/206200796.html,的Session模型 ?了解https://www.sodocs.net/doc/206200796.html, Web应用程序模型 ?了解https://www.sodocs.net/doc/206200796.html, Web应用程序配置文件Web.config的作用、意义及使用方法 ?了解Internet Information Services(以下简称IIS)的基本使用方法 ?了解如何在Microsoft SQL Server中创建一个数据库。 Session模型简介 Session 是什么呢?简单来说就是服务器给客户端的一个编号。当一台WWW服务器运行时,可能有若干个用户浏览正在运行在这台服务器上的网站。当每个用户首次与这台WWW服务器建立连接时,他就与这个服务器建立了一个Session,同时服务器会自动为其分配一个SessionID,用以标识这个用户的唯一身份。这个SessionID是由WWW服务器随机产生的一个由24个字符组成的字符串,我们会在下面的实验中见到它的实际样子。 这个唯一的SessionID是有很大的实际意义的。当一个用户提交了表单时,浏览器会将用户的SessionID自动附加在HTTP头信息中,(这是浏览器的自动功能,用户不会察觉到),当服务器处理完这个表单后,将结果返回给SessionID所对应的用户。试想,如果没有SessionID,当有两个用户同时进行注册时,服务器怎样才能知道到底是哪个用户提交了哪个表单呢。当然,SessionID还有很多其他的作用,我们会在后面提及到。 除了SessionID,在每个Session中还包含很多其他信息。但是对于编写ASP或https://www.sodocs.net/doc/206200796.html,的程序与来说,最有用的还是可以通过访问ASP/https://www.sodocs.net/doc/206200796.html,的内置Session对象,为每个用户存储各自的信息。例如我们想了解一下访问我们网站的用户浏览了几个页面,我们可能在用户可能访问到每个的页面中加入: <% If Session("PageViewed") = ""Then Session("PageViewed") = 1 Else Session("PageViewed") = Session("PageViewed") + 1 End If

Session的生命周期

Session的生命周期 以前在学习的时候没怎么注意,今天又回过头来仔细研究研究了一下Session的生命周期。 Session存储在服务器端,一般为了防止在服务器的内存中(为了高速存取),Sessinon 在用户访问第一次访问服务器时创建,需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session,可调用 request.getSession(true)强制生成Session。 Session什么时候失效? 1. 服务器会把长时间没有活动的Session从服务器内存中清除,此时Session便失效。Tomcat中Session的默认失效时间为20分钟。 2. 调用Session的invalidate方法。 Session对浏览器的要求: 虽然Session保存在服务器,对客户端是透明的,它的正常运行仍然需要客户端浏览器的支持。这是因为Session需要使用Cookie作为识别标志。HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为JSESSIONID的Cookie,它的值为该Session的id(也就是HttpSession.getId()的返回值)。Session依据该Cookie来识别是否为同一用户。 该Cookie为服务器自动生成的,它的maxAge属性一般为-1,表示仅当前浏览器内有效,并且各浏览器窗口间不共享,关闭浏览器就会失效。因此同一机器的两个浏览器窗口访问服务器时,会生成两个不同的Session。但是由浏览器窗口内的链接、脚本等打开的新窗口(也就是说

几种session存储方式比较

几种session存储方式比较 1. 客户端cookie加密 这是我以前采用的方式,简单,高效。比较好的方法是自己采用cookie机制来实现一个session,在应用中使用此session实现。 问题:session中数据不能太多,最好只有个用户id。 参考实现:https://www.sodocs.net/doc/206200796.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

session应用详解

Session 对象 可以使用Session 对象存储特定用户会话所需的信息。这样,当用户在应用程序的Web 页之间跳转时,存储在Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。 当用户请求来自应用程序的Web 页时,如果该用户还没有会话,则Web 服务器将自动创建一个Session 对象。当会话过期或被放弃后,服务器将终止该会话。 Session 对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在Session 对象中。有关使用Session 对象的详细信息,请参阅“ASP 应用程序”部分的“管理会话”。 注意会话状态仅在支持cookie 的浏览器中保留。 语法 Session.collection|property|method 集合 Contents 包含已用脚本命令添加到会话中的项目。 StaticObjects 包含通过 标记创建的并给定了会话作用域的对象。 属性 CodePage 将用于符号映射的代码页。 LCID 现场标识。 SessionID 返回用户的会话验证。 Timeout 应用程序会话状态的超时时限,以分钟为单位。 方法 Abandon 该方法破坏Session 对象并释放其资源。 事件 global.asa 文件中声明下列事件的脚本。 Session_OnEnd Session_OnStart 有关以上事件及global.asa 文件的详细信息, 请参阅Global.asa 参考. 注释 您可以在Session 对象中存储值。存储在Session 对象中的信息在会话及会话作用域内有效。下列脚本演示两种类型的变量的存储方式。 <%

Session保存到数据库

https://www.sodocs.net/doc/206200796.html,将Session保存到数据库中 因为https://www.sodocs.net/doc/206200796.html,中Session的存取机制与ASP相同,都是保存在进行中, 一旦进程崩溃,所有Session信息将会丢失,所以我采取了将Session信息保存到SQL Server中,尽管还有其它的 几个方式(本文不作介绍),要将Session保存到SQL Server中,需要有以下几个步骤: 1.首先要创建用于保存Session数据的数据库,以命令行的形式用aspnet_regsql.exe来完成,具体命令为 C:\WINDOWS\https://www.sodocs.net/doc/206200796.html,\Framework\v2.0.50727>aspnet_regsql.exe -ssadd -sstype c -d sd -E 该命令是以windows验证方式,添加了sd数据库保存session数据。 C:\Windows\https://www.sodocs.net/doc/206200796.html,\Framework\v4.0.30319 InstallSqlStateTemplate.sql 2.需要修改https://www.sodocs.net/doc/206200796.html, web.config文件中的SessionState结点,该结点位于 C:\>Windows\https://www.sodocs.net/doc/206200796.html,\Framework\v2.0.50727>aspnet_regsql.exe -ssadd –sstype c -d MySSO -S QNAGHVGEYNHZKV4\SQLEXPRESS -U wclcck -P 467891 这样一来,Session数据就不再是依赖于IIS进程而是保存到数据库中。可以打开sd数据库会有两个表分别为ASPStateTempSessions、ASPStateTempApplications。

深入理解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!");

session跨域

曾经有很多人问过这个问题,其实SESSION能不能跨域访问取决于COOKIES 能不能跨域访问,如果楼主知道SESSION的原理以后,就应该知道怎样去寻找答案了。 Session对象的原理在于,服务器可以为客户端创建并维护一个所谓的Session对象,用于存放数据。在创建Session 对象的同时,服务器将会为该Session对象产生一个唯一编号,这个编号称之为SessionID,服务器以Cookie的方式将SessionID存放在客户端。当浏览器再次访问该服务器时,会将SessionID作为Cookie信息带到服务器,服务器可以通过该SessionID检索到以前的Session对象,并对其进行访问。需要注意的是,此时的Cookie中仅仅保存了一个SessionID,而相对较多的会话数据保存在服务器端对应的Session对象中,由服务器来统一维护,这样一定程度保证了会话数据安全性,但增加了服务器端的内存开销。 存放在客户端的用于保存SessionID的Cookie会在浏览器关闭时清除。我们把用户打开一个浏览器访问某个应用开始,到关闭浏览器为止交互过程称为一个“会话”。在一个“会话”过程中,可能会向同一个应用发出了多次请求,这些请求将共享一个Session对象,因为这些请求携带了相同的SessionID信息。 所以当我们解决了COOKIES的跨域问题以后,SESSION的跨域验证自然就会OK了~。其实大部分人的做法是通过URL来传递SESSIONID。 Session主要分两部分: 一个是Session数据,该数据默认情况下是存放在服务器的tmp文件下的,是以文件形式存在,而非存储在服务器的内存中; 另一个是标志着Session数据的Session Id,Session ID,就是那个Session 文件的文件名,Session ID 是随机生成的,因此能保证唯一性和随机性,确保Session 的安全。一般如果没有设置Session 的生存周期,则Session ID 存储在内存中,关闭浏览器后该ID 自动注销,重新请求该页面后,重新注册一个session ID。如果客户端没有禁用Cookie,则Cookie 在启动Session 会话的时候扮演的是存储Session ID 和Session 生存期的角色。 两个不同的域名网站,想用同一个Session,就是牵扯到Session跨域问题! 通过了解SESSION 的工作原理,我们可以发现,在默认情况下,各个服务器会各自分别对同一个客户端产生SESSIONID,如对于同一个用户浏览器,A 服务器产生的SESSION ID 是30de1e9de3192ba6ce2992d27a1b6a0a,而B 服务器生成的则是 c72665af28a8b14c0fe11afe3b59b51b。另外,PHP 的SESSION数据都是分别保存在本服务器的文件系统中。想要共享SESSION 数据,那就必须实现两个目标: 一个是各个服务器对同一个客户端产生的SESSION ID 必须相同,并且可通过同一个COOKIE 进行传递,也就是说各个服务器必须可以读取同一个名为PHPSESSID 的COOKIE;另一个是SESSION 数据的存储方式/位置必须保证各个服务器都能够访问到。这两个目标简单地说就是多服务器(A、B服务器)共享客户端的SESSION ID,同时还必须共享服务器端的SESSION 数据。 第一个目标的实现其实很简单,只需要对COOKIE 的域(domain)进行特殊地设置即可(setcookie()函数中的第4个参数),默认情况下,COOKIE 的域是当前服务器的域名/IP 地址,而域不同的话,各个服务器所设置的COOKIE 是不能相互访问的,如https://www.sodocs.net/doc/206200796.html,的服务器是不能读写https://www.sodocs.net/doc/206200796.html,服务器设置的COOKIE 的。这里我们所说的同一网站的服务器有其特殊性,那就是他们同属于同一个一级域,如:https://www.sodocs.net/doc/206200796.html, 和https://www.sodocs.net/doc/206200796.html,都属于域 https://www.sodocs.net/doc/206200796.html,,那么我们就可以设置COOKIE 的域为 https://www.sodocs.net/doc/206200796.html,,这样https://www.sodocs.net/doc/206200796.html,、https://www.sodocs.net/doc/206200796.html,等等都可以访问此COOKIE。这样各个服务器共享同一客户端SESSION ID 的目的就达到了。 第二个目标的实现可以使用数据库来保存SESSION 数据,这样各个服务器就可以方便地访问同一个数据源,获取相同的SESSION 数据了;或者是通过文件共享方式,如NFS 方式,但设置、操作上有些复杂。 如果用数据库存储session数据的话,可能会有遗留问题,就是如果网站的访问量很大的话,SESSION 的读写会频繁地对数据库进行操作,这样效率就会明显降低,好像这里就可以用到C来写段程序存放Session在内存中,而不必每次操作数据库了....