IIS6,SESSION失效的解决
问题描述:由于系统提交时间较长,均在1个小时以上,因此当编辑完成要提交时session已经失效,提交失败,客户反映较为强烈
处理过程:1、加大iis session会话保持时间 2、加大jboss会话保持时间 3、更改nginx会话保持设置
问题扩大化分析:
最近公司各系统或多或少的出现了很多关于session失效的问题,在这里我们总结一下各个中间产品关于session失效的参数设置,但由于集群模式的session失效问题较为复杂,我们这里就不做总结了,今后单独开贴讨论。
1、tomcat
(1)在容器中设置
优先级比较低
tomcat中配置server.xml中定义context时采用如下定义:
<Context path="/demo" docBase="/data/demo"
defaultSessionTimeOut="3600" isWARExpanded="true"
isWARValidated="false" isInvokerEnabled="true"
isWorkDirPersistent="false"/>
(2)web应用设置,优先级比容器中高
设置web应用程序描述符web.xml里的<session-timeout>元素。
<session-config>
<session-timeout>30</session-timeout>
</session-config>
此例表示session将在30分钟后过期 ,默认设置是30分钟
当<session- timeout>设置为-1,表示session将永不过期。
(3)应用代码中设置,优先级最高
jsp页面中控制
session.setmaxinactiveinterval(3600);
session是默认对象,可以直接引 用,单位秒s
servlet中控制
httpsession session = request.getsession();
session.setmaxinactiveinterval(3600); 单位秒 s
2、jboss和tomcat的设置类似,因此不做详细说明了
(1)server\default\deploy\jboss-web.deployer\server.xml
server\all\deploy\jboss-web.deployer\server.xml
(2)server\default\deploy\jboss-web.deployer\conf\web.xml
server\default\all\jboss-web.deployer\conf\web.xml
(3)jsp页面中控制
3、iis
(1)iis中设置如下
(2)web.config 的 system.web 里添加如下配置项:
< httpRuntime
executionTimeout="30"
/>
Application状态为应用程序提供了一个全局的状态。所有客户都可以使用该状态。从设计的角度来说,我们通常用Application来存储一些标准的数据。同时,我们在使用它时要注意避免性能的降低,存储的数据尽可能提供给客户只读的功能。
我们可以使用HttpApplication类的Application属性来访问Application状态,它返回一个HttpApplicationState类的实例。这个类是一个对象集合,可以存储任何类型的数据,并以键/值对的形式存储。一旦数据被存储到状态后,就不会删除,除非应用程序重新启动或者被终止或回收。
我们可以在Global.asax的Application_Start函数中存储数据: void Application_Start(object src, EventArgs e) { int exp = 0; // population of dataset from ADO.NET query not shown // Cache DataSet reference Application["Experiment"] = exp; }
现在你可以在任意页面下使用它:
private void Page_Load(object src, EventArgs e) { int expr = Int32.Parse((Application["Experiment"])); }
由于Application状态对于所有客户都是共享的,如果客户只是读取该数据,则没有什么问题,一旦要进行写操作,就不能保证线程的安全以及出现同步争用的问题。我们可以使用HttpApplicationStateLock类,它派生于ReadWriteObjectLock类,它提供了读/写锁的两种属性。在ASP.Net下,隐式地调用了AcquireWrite()和AcquireRead()方法以保证避免上面的问题。当然,我们也可以显示地使用Lock()和Unlock():
private void Page_Load(object sender, System.EventArgs e) { Application.Lock(); int expr = Int32.Parse((Application["Experiment"])); if (expr>=something) { //do something } Else { //do something else } Application.UnLock(); //Some other thing goes here }
session,cookie,view状态都是用来保存客户端信息的。它们之间又有什么区别呢?
Session状态是在客户登录的时候创建的,它保存了客户特定的信息,并以Session ID来标识。当一个新客户访问应用程序时,先生成一个新的Session ID(或是Session Key),并为同一个客户接下来的请求创建联系。你可以在Session State中存储任意类型的数据,作为你的应用,状态被同一个进程和AppDomain(App域)维护。Session State的特点是为每一个特定的客户创建状态以维护客户的信息,这些状态信息存储在服务器端的默认的会话状态配置中。
Session(“Value”) = expr ; // Storing the data into session object SomeFunction() { int expr = Int32.Parse(Session(“Value”));//Accessing from it if (expr>=something) { //do something } Else { //do something else } //Some other thing goes here }