« DHTML 属性什么是Ajax »

不用Cookies实现的session

http://blog.iyi.cn/user/david/archives/cat_asp.html

跟上一篇设的程序出入不大。

首先,不能有多个sessionID,那样URL会变得很长。关掉浏览器,或丢了sessionID参数,session也就没用了,除非每次都在URL后面留着sessionID参数。暂时不考虑这个问题,把存活期屏蔽。

第二,由于每个访问只有一个sessionID,可能存在多个session共用一个sessionID,因此数据结构有所变化。

第三,要在页面建立时重构所有要使用到session的url,我不知道用asp如何操作url的重构,所以只能用一个函数来重构url以实现这样的功能。

<!--#include file = "conn.asp"-->
<SCRIPT LANGUAGE=jscript RUNAT=Server>
/**********************************************************
* Author: David
* blog: http://blog.iyi.cn/david
* Email: davidnick@126.com
* QQ: 76522970
***********************************************************/
update();
var sessionTimeOut = 10; //how many seconds will a default session keep alive
/**********************************************************
* function setSession(sessionName, sessionValue)
* sessionName: the name of your session
* sessionValue: the value of your session
***********************************************************/
function setSession(sessionName, sessionValue){
var rndNum = Math.round(Math.random()*100000000);
var sessionID = new String(Request.queryString("MYSESSION"));
var createTime = new Date().getTime();
var conn = new Conn();
conn.getConn();
if(sessionID == "undefined" || sessionID == ""){
var queryString = new String(Request.serverVariables("QUERY_STRING"));
var URI = Request.serverVariables("URL");
sessionID = new String(rndNum);
if(queryString == "undefined" || queryString == ""){
queryString = "MYSESSION=" + sessionID;
}else{
queryString += "&MYSESSION=" + sessionID;
}
var sql = "insert into [session] (sessionID,sessionName,sessionValue,sessionExpires,createTime) values ('" + rndNum + "','" + sessionName + "','" + sessionValue + "',0," + createTime + ")";
conn.execute(sql);
conn.close();
Response.Status="301 Moved Permanently";
Response.AddHeader("Location",URI + "?" + queryString);
Response.end();
}else{
var sql = "select * from [session] where sessionID = '" + sessionID + "' and sessionName = '" + sessionName + "'";
var rs = Server.CreateObject("adodb.recordset");
rs.open(sql,conn.conn,1,3);
if(rs.recordcount){
rs("sessionValue") = sessionValue;
rs("createTime") = createTime;
}else{
rs.addNew;
rs("sessionID") = sessionID;
rs("sessionName") = sessionName;
rs("sessionValue") = sessionValue;
rs("sessionExpires") = 0;
rs("createTime") = createTime;
}
rs.update;
rs.close();
conn.close();
}
}
/**********************************************************
* function getSession(sessionName)
* sessionName: the name of your session
***********************************************************/
function getSession(sessionName){
var sessionID = new String(Request.queryString("MYSESSION"));
if(sessionID != "undefined" && sessionID != ""){
var conn = new Conn();
conn.getConn();
var sql = "select * from [session] where sessionID = '" + sessionID + "' and sessionName = '" + sessionName + "'";
var rs = Server.CreateObject("adodb.recordset");
rs.open(sql,conn.conn,1,1);
if(rs.recordcount){
return rs("sessionValue");
}else{
Response.cookies("MYSESSION" + sessionName) = "";
Response.cookies("MYSESSION" + sessionName).Expires = (new Date()).toLocaleString();
return '';
}
rs.close();
conn.close();
}else{
return '';
}
}
/**********************************************************
* function cleanUp()
* use this function to clear up the overdue session data
***********************************************************/
function cleanUp(){
var nowTime = new Date().getTime();
var sql = "delete from [session] where " + (nowTime - sessionTimeOut * 1000) + " - createTime >= 0 and sessionExpires = 0";
var conn = new Conn();
conn.getConn();
conn.execute(sql);
conn.close();
}
/**********************************************************
* function update()
* use this function to update the session state
***********************************************************/
function update(){
var sessionID = new String(Request.queryString("MYSESSION"));
if(sessionID == "undefined" || sessionID == ""){
return;
}else{
var createTime = new Date().getTime();
var conn = new Conn();
conn.getConn();
var sql = "update [session] set createTime = " + createTime + " where sessionID = '" + sessionID + "'";
conn.execute(sql);
conn.close();
}
}
/**********************************************************
* function parseUrl(url)
* use this function to create the url if the session has been set
* if you want to use session in the next page, you must use this function
* url the url you want to use session
***********************************************************/
function parseUrl(url){
var sessionID = new String(Request.queryString("MYSESSION"));
if(sessionID != "undefined" && sessionID != ""){
var re = new RegExp("\\?","g");
var p = re.exec(url);
if(re.lastIndex){
url += "&MYSESSION=" + sessionID;
}else{
url += "?MYSESSION=" + sessionID;
}
}
return(url);
}
setSession('session 0','this will Expires after the browser closed',0);
cleanUp();
Response.write("<a href=\"" + parseUrl("test.asp") + "\">test.asp</a>");
</SCRIPT>

下载代码:Download file

function setSession(sessionName, sessionValue)
用于建立session

function getSession(sessionName)
则用于获得session

像上一个程序一样,需要在每个页面的开始调用update()函数来维护session,需要偶尔调用cleanUp()来清除过期的session

需要使用parseUrl(url)这个函数来重构页面内所有要用到session的连接,就像上面程序的底部那样Response.write("<a href=\"" + parseUrl("test.asp") + "\">test.asp</a>");

通过var sessionTimeOut = 10;设置默认session过期时间为10秒,我是为了使用才设置这么短,实际中应该设置的长一些,比如100秒。这个设置为全局变量会更好,可惜JScript没有全局变量,这样我们需要在每一页都设置,也许你会想到用Application,但是那样我们无法为某一页单独设置。有兴趣的同学可以将这个程序转换成VBScript,很简单,我现在有些讨厌VBS了:L

好了,这样子这个用Url传递sessionID的程序已经可以运行了,不过两个程序目前还没法一起使用,下一篇文章我将努力把这两个session程序统一起来。

其实写这两个程序之前,我是想实现一种安全的用户登录验证机制(目前asp网站上使用的登陆验证程序千篇一律,都不是很安全,尤其动网那个,非常垃圾!不是诽谤,我将在最近把那套机制完成,到时便见分晓),写了一半,发现asp.net的session跟我的想法有些不谋而合,就先把这两个程序写出来了,稍后我会把这套机制建立起来,写在blog中。也许还会在此基础上实现一套网站系统,还没确定要做什么系统。敬请期待^^

程序中可能存在错误,欢迎大家指正,交流:)

原创文章如转载,请注明:转载自悠悠博客 [ http://www.ajaxstu.com/ ]

相关文章:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。