• Session探秘 PHP


    Session会话状态探秘

    测试环境:WIN2003 + VS2005 + ASP.NET + C# + IIS6.0

    Session 会话状态模式为 InProc的情况下。

    官方参考:http://msdn.microsoft.com/zh-cn/library/ms178581(v=vs.80).aspx

    Session基本操作

    添加 修改 Session项

    Session.Add("test", DateTime.Now);
    Session["test"] = DateTime.Now;

    添加和修改Session的方法是一样的,当指定的Session标识不存在时,系统会添加。当存在时系统会更新。

    删除 Session项

    Session.Remove("test");

    不要使用Session["test"] = null; 这样只是将值设置为NULL!

    移除所有Session项

    Session.Clear();Session.RemoveAll();

    终止当前会话状态

    Session.Abandon();

    当前Session项数量

    Session.Count

    当前SessionId

    Session.SessionID

    Session何时创建

    所有浏览器(IE、Chrome、FireFox)当第一次打开浏览器时(当前未运行浏览器时),服务器端会创建新的Session。

    IE浏览器,当已有浏览器运行时,打开新的浏览器则会创建新的Session。

    而Chrome、FireFox当已有浏览器运行时,打开新的浏览器不会创建新的Session。

    当Session过期后,继续访问时会创建Session。当Session创建时会触发 Global.asax 中的Session_Start方法。

    Session何时过期

    • 代码 Session.Abandon(); 引起Session过期。
    • Session超时,自动过期。
    • Web.config 被修改,将会过期。
    • IIS的应用程序池被回收引起。

    当Session过期时会触发 Global.asax 中的Session_End方法。

    奇怪的问题:

     Session.Abandon(); 和 Session超时自动过期的效果是一样的。引起的过期后,当刷新页面时会执行Session_Start 和 Session_End方法。

    如何避免在Session_Start 中添加Session["SessionStartDateTime"] = DateTime.Now;

    在调用Session.Abandon();后执行Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", ""));让SessionId重置。

    Session过期时间

    在web.config中设置 <sessionState mode="InProc" timeout="20"></sessionState> 分钟值。(未填写时默认是20分钟过期)

    IIS的会话超时设置并不起效。(设置位置如下图)

    网站关联的应用程序池,的回收时间限制。经测试也不起效。但如果手动回收或设置定时回收则起效。

    (如何关联网站应用程序池如下图)

    如何防止Session过期

    可以设置较长的Session过期时间。但如果设置过长可能会引起服务器负担过重。

    将Session模式设置为进程外或数据库中。在此就不做讨论。

    一般实际情况可能是,用户在某些页面,如博客文章提交页,在编辑过程因为要很长时间。

    可能在提交时发现Session过期了。而导致用户信息丢失无法提交文章。

    如果是这种情况,可能只想将指定页面的Session时间延长。可以通过Ajax定时访问后台的一空白页面。来保持Session在线。

    <script type="text/javascript">
        function updateSession(){
            $.get('/ajax/updateSession.aspx');
        }
        window.setInterval(updateSession, 60000);
    </script>

    建立一个空页面updateSession.aspx

    注意在Page_load中添加 注意当ajax请求aspx页面时,aspx页面应设置为不允许缓存!

    protected void Page_Load(object sender, EventArgs e)
    {
        Response.AppendHeader("pragma", "no-cache");
        Response.AppendHeader("Cache-Control", "no-cache, must-revalidate");

        Response.AppendHeader("expires", "0");
    }

    关于SessionId

    当Session过期后,SessionId并未改变。

    调用 Response.Cookies.Add(new HttpCookie("ASP.NET_SessionId", "")); 可设置SessionId

    当设置为空时,服务器端会创建新的Session。而老的Session并未被释放。

    当设置为其他已有的SessionId值时,此时的Session将获取的是指定的Session。这就是Session劫持了。

    如何统计当前网站Session个数。

    创建类

    public class Constants
    {
    	/// <summary>
    	/// 当前Session个数
    	/// </summary>
    	public static int SessionCount = 0;
    
    	/// <summary>
    	/// 累计Session个数
    	/// </summary>
    	public static int SessionAllCount = 0;
    }
    

    在Global.asax中添加

    void Session_Start(object sender, EventArgs e)
    {
    	Constants.SessionAllCount++;
    	Constants.SessionCount++;
    	Session["SessionStartDateTime"] = DateTime.Now;
    }
    
    void Session_End(object sender, EventArgs e)
    {
    	Constants.SessionCount--;
    }
    

    测试代码下载

    测试代码下载: https://files.cnblogs.com/zjfree/SessionTest.rar

    测试环境:WIN2003 + VS2005 + ASP.NET + C# + IIS6.0


    欢迎转载,转载请注明:转载自[ http://www.cnblogs.com/zjfree/ ]
  • 相关阅读:
    java 求两个数最大值
    java 加法运算
    javs switch 语句
    git合并分支成功,但是push失败(remote: GitLab: You are not allowed to push code to protected branches on this project.)
    python 获取日期以及时间
    1713
    linux shell脚本中的延时
    java 类的继承
    Python3 使用企业微信 API 发送消息
    java if 条件语句
  • 原文地址:https://www.cnblogs.com/zjfree/p/1980309.html
Copyright © 2020-2023  润新知