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对象传送路径;

  ●Secure:明确Cookie对象是否安全;

  ●HasKeys:返回Cookie对象是否包含多值。

  如果没有显式定义Cookie对象的Expires属性,Cookie对象将在用户会话期结束时到期。

  ASP中通过Request集合和Response集合读写对象。向Cookie对象写变量的语法如下:

  Response.Cookies(cookie)[(Key)|.attribute] = value

  其中,cookie是Cookie文件名,Key标明一个字典元素,attribute是Cookie 的一个具体性质,value是分给cookie的值。例如,为创建一个叫MyHobby的Cookie,并分配其值为:BasketBall,使用下述语法:

  <%Response.Cookies(“MyHobby")=“BasketBall" %>

  在客户机器上读取Cookie对象的方法如下:

  Request.Cookies(cookie)[(Key)|.attribute]

  其中,cookie是被请求Cookie的名字,Key是子关键字值下标,attribute是用于标明Cookie属性。例如:为抽取一个叫做MyHobby的Cookie中的信息并将它的值写到页面,使用下述语法:

  <% Request.Cookies(“MyHobby") %>

  需要注意的是:不能在HTTP页首信息已被送到请求浏览器之后,再向一个Cookie对象写入信息。换句话说,不能在任何HTML标识符被发送到浏览器之后才向浏览器发送Cookie信息。

  具体实现

  下面通过一个基于ASP技术的聊天室的实现,来介绍如何处理Session对象变量失效的问题。

  ●在用户登录前初始会话级变量:UserName(用于存储登录用户名)。

  <% Session(“UserName")=“" %>

  //初始化Cookie对象

  <% Response.Cookies(“UserName")=“" %>

  ●在用户登录时,设置会话级变量并备份到客户端Cookie对象中。

  <%userName=Trim(Request.For(“UserName"))%>

  <% Session(“UserName")=userName %>

  //将会话级变量备份到客户端Cookie对象中

  <% Response.Cookies(“UserName")=userName %>

  ●在用户发言的时候,读取会话级变量,如果该变量已经失效,则通过读取Cookie对象,恢复该会话级变量的属性值。

  <% userName=Session(“UserName") %>

  //如果变量已经失效,则检索客户端Cookie对象

  <% if userName=“" then %>

  <% userName=Request.Cookies(“UserName") %>

  <% if userName=“" then %>

  //如果用户未经过登录就进入聊天室,则该Cookie对象属性值为空。此时,提示用户出错,并转向用户登录页面

  <% Response.Redirect “Error.html" %>

  <% else %>

  //从Cookie对象中恢复该会话级变量

  <% Session(“UserName")=userName %>

  <% end if %>

  <% end if %>

  ●当用户退出聊天室时,清除会话级对象和Cookie对象。

  <% Session(“UserName")=“" %>

  //将Cookie对象属性值清除,避免用户不经过登录就直接进入聊天室

  <% Response.Cookies(“UserName")=“" %>

  以上代码在Windows NT 4.0+IIS 4.0+IE 5.0环境中运行通过。

  小 结

  Session对象与Cookie对象在客户端联合存取会话级变量的方法简单实用,并且能够有效地避免用户强行登录等问题,不失为一种较好地解决Session对象失效的客户端方法。

时间: 2006-06-05

异步 HttpContext.Current实现取值的方法(解决异步Application,Session,Cache...等失效的问题)

回答的也多数都是:引用System.Web,不要用HttpContext.Current.Application应该用System.Web.HttpContext.Current.Application,后来在网上看到一篇关于System.Runtime.Remoting.Messaging.CallContext这个类的详细介绍才知道,原来HttpContext.Current是基于System.Runtime.Remoting.Messaging.CallContext这个类,子线程和异步线

iframe跨域与session失效问题的解决办法

何为跨域跨域session/cookie? 也就是第三方session/cookie.第一方session/cookie指的是访客当前访问的网站给访客的浏览器设置的seesion /cookie, 会被存储在访客的计算机上.第三方session/cookie指的是当前访问的网站中会加载(嵌入)另外第三方的网站代码,例如促销广告,那么第三方网 站也会在访客的计算机上添加session/cookie,这种就是第三方session/cookie. 我的问题 在开发讯息在线产品(http://iap.p

Laravel 5框架学习之表单

首先让我们修改路由,能够增加一个文章的发布. 复制代码 代码如下: Route::get('articles/create', 'ArticlesController@create'); 然后修改控制器 复制代码 代码如下: public function create() {         return view('articles.create');     } 我们返回一个视图,新建这个视图.我们当然可以直接使用HTML建立表单,但我们有功能更好的办法.我们使用一个开源库,Jeffrey

Laravel 5框架学习之Eloquent (laravel 的ORM)

我们来生成第一个模型 复制代码 代码如下: php artisan make:model Article #输出 Model created successfully. Created Migration: 2015_03_28_062517_create_articles_table 查看一下生成的文件 app/Article.php <?php namespace App; use Illuminate\Database\Eloquent\Model; class Article exten

浏览器关闭使session失效的问题多种解决方式

如果用户不点击网站的"退出"链接,而直接关闭浏览器(或者强制关闭浏览器进程.死机等),服务器无法处理用户退出网站的请求,解决方式如下: 方式1:在每个页面中加入隐藏的IFrame,以异步刷新的方式定期刷新iframe页面,如每隔10S刷新一次,当服务器在一定的时间内未收到用户的刷新请求,则认为用户已经退出 优点:能在短时间内判断出用户是否已经退出 缺点:增加用户请求次数,所消耗的服务器资源较大 方式2:使用cookie保存用户登录信息,不要设置cookie的过期时间,当关闭浏览器时,c

Laravel 5框架学习之表单验证

在建立一个文章的时候,如果你什么都不输入直接提交,ok,你获得了一个空的文章,没有任何错误提示,这是不对的.在命令行下运行 php artisan 可以看到一个选项 make:request,新建一个form request类.在命令行执行 复制代码 代码如下: php artisan make:request CreateArticleRequest 生成的文件在 app/http/requests 目录下.在文件中我们可以看到两个方法: public function authorize()

关于扩展 Laravel 默认 Session 中间件导致的 Session 写入失效问题分析

最近由于项目开发需要,手机客户端和网页端统一使用一套接口,为保证 会话(Session) 能够正常且在各类情况下兼容,我希望能够改变 SessionID 的获取方式.默认情况下,所有网站都是通过 HTTP 请求的 Header 头部中的 Cookie 实现的,通过 Cookie 中指定的 SessionID 来关联到服务端对应数据,从而实现会话功能. 但对于手机客户端,可能并不会支持原始的 Cookie,亦或者根据平台需要而屏蔽,因此开发中要求通过增加一个请求头 X-Session-Token

Laravel 5 框架入门(一)

Laravel 5 中文文档: 1. http://laravel-china.org/docs/5.0 2. http://www.golaravel.com/laravel/docs/5.0/ 默认条件 本文默认你已经有配置完善的 PHP + MySQL 运行环境,懂得 PHP 网站运行的基础知识.跟随本教程走完一遍,你将会得到一个基础的包含登录的简单 blog 系统,并将学会如何使用一些强大的 Laravel 插件和 composer 包(Laravel 插件也是 composer 包).

Laravel 5框架学习之日期,Mutator 和 Scope

在我们前面的解决方案中,直接给 published_at 赋值为当前日期实际上是一个临时解决方案,我们需要设定发布日期,可能是未来2天后才发布,让我们修改这个问题. 首先修改控制器: public function store() { Article::create(Request::all()); return redirect('articles'); } 然后修改视图,添加发布日期字段 @extends('layout') @section('content') <h1>Write a

Laravel 5框架学习之环境与配置

.env 文件是配置文件,包括数据库配置信息,查看 config->database.php ,connections 里面包含了所有数据库的配置,可以在 default 中选择要使用的数据库.在数据库配置中,有关 env('DB_HOST', 'localhost') 就是读取 .env 配置文件的信息.第二个参数是缺省参数. 我们使用 mysql 数据库,修改 .env: DB_HOST=localhost DB_DATABASE=laravel DB_USERNAME=root DB_PA

Laravel 5框架学习之路由、控制器和视图简介

查看 app/Http/routes.php 复制代码 代码如下: Route::get('/', 'WelcomeController@index'); @是一个界定符,前面是控制器,后面是动作,表示当用户请求url / 的时候,执行控制器 WelcomeController 中的 index 方法 复制代码 代码如下: app/http/controllers/welcomecontroller.php public function index() { return view('welco

Laravel 5框架学习之Laravel入门和新建项目

此系列文章是 laracasts.com 中的入门系列视频的笔记,我做了一些修改,可以参考此系列文章来学习 Laravel 5.原视频作者是 Jeffrey Way, 在此感谢.本人使用的系统是Mac系统,但是无论Mac还是Windows用户,都推荐使用虚拟机安装linux(server版即可),然后采用共享文件夹的方式开发.所有的命令行命令应该在虚拟中执行,文件修改在主机中,推荐使用phpstorm. Laravl 是什么 Laravel是一套简洁.优雅的PHP Web开发框架 (PHP We

Laravel 5框架学习之模型、控制器、视图基础流程

添加路由 复制代码 代码如下: Route::get('artiles', 'ArticlesController@index'); 创建控制器 复制代码 代码如下: php artisan make:controller ArticlesController --plain 修改控制器 <?php namespace App\Http\Controllers; use App\Article; use App\Http\Requests; use App\Http\Controllers\Co

Laravel 5框架学习之用户认证

Laravel 出厂已经带有了用户认证系统,我们来看一下 routes.php,如果删除了,添加上: Route::controllers([ 'auth' => 'Auth\AuthController', 'password' => 'Auth\PasswordController' ]); 可以使用 php artisan route:list 查看一下.浏览器中访问 /auth/login,可以看到登陆界面,最好把系统默认的 app.blade.php 中关于 google 的东西注释

Laravel 5框架学习之数据库迁移(Migrations)

database migrations 是laravel最强大的功能之一.数据库迁移可以理解为数据库的版本控制器. 在 database/migrations 目录中包含两个迁移文件,一个建立用户表,一个用于用户密码重置. 在迁移文件中,up 方法用于创建数据表,down方法用于回滚,也就是删除数据表. 执行数据库迁移 复制代码 代码如下: php artisan migrate #输出 Migration table created successfully. Migrated: 2014_1