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

21

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

Update PaneljQuery ajax这样的Ajax请求是否会导致重置会话超时?

谢谢。


编辑1)

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


我提出了这个问题:http://stackoverflow.com/questions/10432428/session-timeout-on-sqlserver-mode-inside-ajax-updatepanel - Dan An
4
使用 Fiddler 或 IE 中的 F12,您可以看到所有的 cookie(包括会话 cookie)在 AJAX 调用时都被发送。因此服务器知道用户的活动情况。简而言之,无论是否使用 AJAX,会话都会随着用户的活动得到延长。 - Arcturus
4个回答

21

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

如果您不停地调用服务器端代码,则会话不会过期。会话超时将在每个请求到服务器时重置。在对同一网站进行后续请求时,浏览器提供ASP.NET_SessionId Cookie ,服务器端模块使用该Cookie访问会话值(例如用户信息)。

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

这里输入图像描述

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

问题2 - Ajax请求会导致重置会话超时吗?例如Update Panel,jQuery ajax等。

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

Session 在用户请求之间的等待时间过长时会过期。如果您不断调用 服务器端 代码,则 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" />

2
我认为“如果您不断调用服务器端代码,会话将不会过期”的说法是不正确的。我有一个简单的页面,其中包含一个“Update Panel”和一个按钮,我每2分钟点击一次该按钮,但会话在20分钟后过期。 - Arian
@Kerezo - 我的Web.config中Session Timeout = 1。我的表单中有相同数量的控件。我每15秒按一次按钮,处理过程持续3分钟。 - Pankaj
你的会话是否使用了“无 Cookie”模式? - Arian
1
我认为是因为 Cookieless=true 所以你的 session 没有过期。 - Arian
1
是的。否则,它也会开始新的会话。抱歉,我以为查询是关于带有 cookies 的会话上下文的。 - Pankaj

13

是的,它会影响。无论您是否实际使用Session都没关系。
但是,如果您仅仅使用ajax调用,可能会遇到一些问题。
(虽然我自己没有遇到过,这里有一个解释)


1
你能详细说明你不确定的是什么吗?就像我所说的,我以前从未遇到过这种行为,所以我自己也不是100%确定。但是,构建一个发送AJAX请求的小型测试网页并查看会话是否保持活动状态应该不成问题。 - J. Ed
4
即使您只使用ajax调用,也没有问题。 - Arcturus
有人有sessionState超时“滑动”随每个新请求的证明吗?关于AJAX调用,用户J.Ed提供了一个链接https://ranjitkumars.wordpress.com/2010/03/02/asp-net-ajax-prevent-session-timeout/,其中建议AJAX调用不会滑动sessionState超时...但Arcturus反驳了这一点...我在任何官方Microsoft文档中都没有看到相关内容... - Nate Anderson

4

无论我们是否检查会话变量,会话超时时间每次请求都会重置吗?还是我们应该至少使用一个会话变量?

在建立会话变量之前,每次提交后端都会生成一个新的会话ID。

像Update Panel、jQuery ajax等,Ajax请求会导致重置会话超时时间吗?

默认情况下,保存在cookie中的会话ID将被发送到每个AJAX和非AJAX请求。因此,服务器知道会话用户处于活动状态。不要只听我的。可以使用Fiddler或IE中的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.";
        }

---您可以根据自己的情况进行安排。但是这个想法很简单。 您加载页面后,点击“Renew”按钮,这将设置您的会话。等待61秒,页面将刷新,会话变量消失。再试一次,但这次在几秒钟后点击另外两个按钮之一,在页面刷新时,您将看到会话变量已经从ajax调用中保持完好。 在这种情况下,ajax调用刷新了会话变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接