发新话题
打印

[转载]不用Cookies实现的session

[转载]不用Cookies实现的session

文章作者:David
信息来源:http://blog.iyi.cn/david


首先,不能有多个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:  [url]http://blog.iyi.cn/david[/url]
* Email: [email]davidnick@126.com[/email]
* 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 (&#39;" + rndNum + "&#39;,&#39;" + sessionName + "&#39;,&#39;" + sessionValue + "&#39;,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 = &#39;" + sessionID + "&#39; and sessionName = &#39;" + sessionName + "&#39;";
  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 = &#39;" + sessionID + "&#39; and sessionName = &#39;" + sessionName + "&#39;";
  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 &#39;&#39;;
  }
  rs.close();
  conn.close();
}else{
  return &#39;&#39;;
}
}
/**********************************************************
* 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 = &#39;" + sessionID + "&#39;";
  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(&#39;session 0&#39;,&#39;this will Expires after the browser closed&#39;,0);
cleanUp();
Response.write("<a href=\"" + parseUrl("test.asp") + "\">test.asp</a>");
</SCRIPT>
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://blog.iyi.cn/user/david/archives/images/mysession_url.rar
觉得你够三八吗? 觉得你有资格和我挑吗? 那就到八里街XX洗头店找 老板娘单挑吧 活着回来的找我 http://Www.OkHtm.Com ---------------------------------------------------------- 不要看俺了,俺只是来学习的 学习你们的三八精神的.

TOP

发新话题