会话超时是不是在每个请求上重置

Posted

技术标签:

【中文标题】会话超时是不是在每个请求上重置【英文标题】:Does Session timeout reset on every request会话超时是否在每个请求上重置 【发布时间】:2012-05-09 08:26:09 【问题描述】:

不管我们是否检查会话变量,会话超时是否会在每个请求上重置?或者我们应该使用至少一个会话变量?

Ajax 请求是否会导致重置会话超时?比如Update Panel,jQuery ajax,...

谢谢


编辑 1)

HTTP Get 是否会导致重置会话超时??

【问题讨论】:

我提出了这个问题:***.com/questions/10432428/… 在 ie 中使用 fiddler 或 f12。您将看到所有的 cookie(包括会话 cookie)甚至 AJAX 调用都被发送。所以服务器知道这个活动。长话短说,ajax 或没有 ajax,会话随着用户活动而延长。 【参考方案1】:

不管我们是否检查会话变量,会话超时是否会在每个请求上重置?或者我们应该使用至少一个会话变量?

在建立会话变量之前,每次回发都会生成一个新的会话 ID。

Ajax 请求是否会导致重置会话超时?比如更新面板,jQuery ajax,...

默认保存在 cookie 中的会话 ID 会针对每个 AJAX 和非 AJAX 请求发送。因此服务器知道会话用户是活动的。不要相信我的话。在 ie 中使用 fiddler 或 F12 工具。您可以看到每个 AJAX GET/POST 请求发送的 cookie。

【讨论】:

【参考方案2】:

这取决于很多因素,所以我建议您进行如下测试。真正需要不到 5 分钟的时间来确定您的确切情况是否适用于您的环境。 这是我用来测试这个的代码,我使用 Telerik 控件来测试这个想法,但我添加了一个 .get 以获得您想要的确切答案。 aspx 页面有

<telerik:RadScriptManager ID="RadScriptManager1" Runat="server">
        </telerik:RadScriptManager>
        <telerik:RadAjaxManager ID="ram" runat="server">
            <AjaxSettings>
                <telerik:AjaxSetting AjaxControlID="btnFake">
                    <UpdatedControls>
                        <telerik:AjaxUpdatedControl ControlID="lblAnswer" />
                    </UpdatedControls>
                </telerik:AjaxSetting>
            </AjaxSettings>
        </telerik:RadAjaxManager>
        <script src="Scripts/jquery-1.4.1-vsdoc.js"></script>
    <script>
        $(document).ready(function () 
            setTimeout(function ()  document.location.href = "default.aspx?next"; , 61000);
            setInterval(function () 
                var divForTimer = $("#divTime");
                var secs = parseInt(divForTimer.html());
                secs = secs + 1;
                $("#divTime").html(secs.toString());
            , 1000);

        );
        function getPage() 

            $.get("test.aspx", function(result) 
                $("#btnFake").val("Got it");

            );
        
    </script>
   <asp:Label ID="lblAnswer" runat="server"></asp:Label>
   <Asp:button ID="btnTest" runat="server" Text="Renew" onclick="btnTest_Click" />
   <input type="button" ID="btnAjaxget"  onclick ="getPage()"  value="Ajax get" />
   <asp:Button ID="btnFake" runat="server"  Text ="Fake it" 
        onclick="btnFake_Click"/>
        <div id="divTime">1</div>

.cs 页面有

protected void Page_Load(object sender, EventArgs e)
        
            Session.Timeout = 1;
            if (EMSG.CommonFunctions.GetSession("test").Length > 0)
            
                this.lblAnswer.Text = "Session=" + EMSG.CommonFunctions.GetSession("test");
            
            else
            
                this.lblAnswer.Text = "No session";
            

        

        protected void btnTest_Click(object sender, EventArgs e)
        
            Session["test"] = "variable set";
            this.lblAnswer.Text = Session["test"].ToString();
        

        protected void btnFake_Click(object sender, EventArgs e)
        
            lblAnswer.Text = "Ajax called.";
        

---您可以根据自己的情况安排以上内容。但这个想法很简单。 您加载页面。单击“更新”按钮,这将设置您的会话。等待 61 秒,页面将刷新,会话变量消失。再试一次,但这次在几秒钟后单击其他两个按钮之一,当页面刷新时,您将看到会话变量在 ajax 调用中保持不变。 这种情况下的ajax调用会刷新会话变量。

【讨论】:

【参考方案3】:

会话超时是否会在每个请求上重置,无论我们是否 检查会话变量?

如果您继续调用服务器端代码,Session 将不会过期。 session 超时将在每次请求服务器时重置。在对同一网站的后续请求中,浏览器提供ASP.NET_SessionId Cookie,服务器端模块使用该ASP.NET_SessionId Cookie 访问会话值(如用户信息)。

---------------------------------------------------------------------------------
                     How to detect the Session TimeOut
---------------------------------------------------------------------------------

---------------------------------------------------------------------------------

问题 - 2 - Ajax 请求是否会导致重置会话超时?像更新面板 ,jQuery ajax ,...

问题 - 3 - HTTP Get 会导致重置会话超时吗??

Session 将过期,以防用户在请求之间等待的时间过长。如果您继续调用server side 代码,Session 将不会过期。 session 超时将在每次请求服务器时重置

Web.Config

<sessionState mode="InProc" stateConnectionString="tcpip=127.0.0.1:42424" 
 sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
    cookieless="true" timeout="1" />

【讨论】:

我认为Session will not expire if you keep on calling server side code 声明不正确。我有一个带有Update Panel 和按钮的简单页面,我每2 分钟点击一次按钮,会话在20 分钟后过期 @Kerezo - 我的Web.config 中有会话Timeout = 1。我的表单中有相同数量的控件。我每 15 秒点击一次按钮,过程一直持续到 3 分钟。 你的会话是CookieLess吗? 我想是因为Cookieless=true你的会话没有过期 是的。否则,它也会开始新的会话。抱歉,我的印象是查询是在与 cookie 会话的上下文中。【参考方案4】:

是的,确实如此。您是否实际使用Session 并不重要。 但是,如果您只使用 ajax 调用,则可能会遇到一些问题。 (虽然我自己没遇到过,here的解释)

【讨论】:

您能详细说明您不确定的地方吗?正如我所说,我以前从未遇到过这种行为,所以我不是 100% 自己。不过搭建一个发送AJAX请求的小测试网页应该是没问题的,看看会话是否保持活跃。 即使只使用ajax调用也没问题。 是否有人证明 sessionState 超时随着每个新请求“滑动”?回复:特别是 AJAX 调用,用户 J.Ed 提供了一个链接 ranjitkumars.wordpress.com/2010/03/02/…,这表明 AJAX 调用不会滑动 sessionState 超时......但 Arcturus 反驳了这一点......而且我在任何地方都没有看到任何官方的 Microsoft 文档...... .

以上是关于会话超时是不是在每个请求上重置的主要内容,如果未能解决你的问题,请参考以下文章

超时会话的时间

SQLAlchemy 是不是从同一连接重置 SQLAlchemy 会话之间的数据库会话?

session_unset() 是清除和重置 PHP 会话变量的正确方法吗?

PHP - 您是不是需要再次设置会话数据以重置生命周期?

PHP max_execution time 是不是在每个函数调用上重置?

PHP Unset 正在重置我的会话数组