import JSON; import fsys.file; import fsys; namespace sessionHandler.default; root = "/config/session/"; //载入用户session startSession = function(expires){ var id = ..request[["sessionId"]]; if(!id) return error("request.sessionId 不能为 null"); var path = ..io.joinpath(root,"#." + id); if(!..io.exist(path) ) return {}; var file; for(i=1;10;1){ file = ..fsys.file(path,"rb",0x1/*_FILE_SHARE_READ*/); if(file) break; sleep(100); } if(!file) error("打开session文件失败!"); var write = file.getTime().write; expires = expires : 1800; if( write &&( ..time().diffsecond(write) > expires ) ){ file.close(); ..fsys.delete(path) ; return {}; } var str = file.read(-1); file.close(); var ses = ..JSON.tryParse(str) : {}; return ses; } //用户修改了session updateSession = function(ses,k,v){ saveSession(ses); } //清空session clearSession = function(){ saveSession({}); } //保存session saveSession = function(ses,expires){ var id = ..request[["sessionId"]]; if(!id) return error("request.sessionId 不能为 null",2); var ses = ..JSON.stringify(ses); if(ses=="{}") return; ..io.createDir(root); var path = ..io.joinpath(root,"#." + id); var file,err; for(i=1;10;1){ file ,err= ..io.file(path,"w+b",0x10/*独占读写*/); if(file) break; sleep(100); } if(!file) error( ..string.concat("打开 session 文件失败!",err) ); file.write(ses); file.close(); if( expires === null ) return; ..thread.invoke( function(expires,rootDir){ sleep(100); import fsys; import fsys.file; var files = ..fsys.list(rootDir); var now = tonumber(..time()) for(i,id in files){ var path = ..io.joinpath(rootDir,id); var file = ..fsys.file(path); if(file){ var write = file.getTime().write; file.close(); if( tonumber(now) -tonumber(write) > expires ){ ..fsys.delete(path) } } } },expires,root ) } /*****intellisense() sessionHandler.default = 存储 HTTP 服务器 session 会话接口的默认实现。\naardio 实现的所有 HTTP 服务端都会自动导入 sessionHandler.default 。 sessionHandler.default.root = 存储根目录。默认值为 "/config/session/" 。 end intellisense*****/ /**details(说明) 所有 HTTP 服务器 session 会话存储器都必须是 sessionHandler 命名空间的成员。 如果没有导入其他 session 存储器,则默认使用 sessionHandler.default 。 所有 session 会话存储器 都必须实现以下接口: ```aardio //载入用户session startSession = function(expires){ //返回会话存储表(用与读写键值对的 table 对象) return ses; } //用户修改了 session 调用此函数,ses 为会话存储表,k,v 为要更新的键与值。 updateSession = function(ses,k,v){ saveSession(ses); } //清空 session 调用此函数 clearSession = function(){ saveSession({}); } //保存 session 调用此函数,ses 为会话存储表,expires 参数指定过期秒数 saveSession = function(ses,expires){ } ``` 细节请参考标准库 sessionHandler.default 的源码。 end details**/