【问题标题】:Session timeout during using the application使用应用程序期间的会话超时
【发布时间】:2019-05-06 18:13:53
【问题描述】:

目前我正在编写一个 Web 应用程序,但有些同事有时会提到,他们在使用 Web 应用程序期间会遇到会话超时。 我无法重现该错误,也不确定可能是什么错误。因为活跃的工作有足够的页面加载,所以自上次点击以来的时间比 15 分钟的超时时间短。还有什么原因?

Web.config:

<sessionState mode="InProc" timeout="3" customProvider="DefaultSessionProvider">

自动重定向 c#:

public partial class AutoRedirect : System.Web.UI.UserControl
    {
        public string LoginDate;
        public string ExpressDate;
        protected void Page_Load(object sender, EventArgs e)
        {
            string PageName = Path.GetFileName(Request.Url.AbsolutePath);

            // Check session is expire or timeout.
            if (Session["username"] == null)
            {
                if (PageName != Constants.defaultPage && PageName != Constants.loginPage)
                {
                    Response.Redirect(Constants.defaultPage);
                }
            }

            // Get user login time or last activity time.
            DateTime date = DateTime.Now;
            LoginDate = date.ToString("u", DateTimeFormatInfo.InvariantInfo).Replace("Z", "");
            int sessionTimeout = Session.Timeout;
            DateTime dateExpress = date.AddMinutes(sessionTimeout);
            ExpressDate = dateExpress.ToString("u", DateTimeFormatInfo.InvariantInfo).Replace("Z", "");
        }
    }

自动重定向 ascx:

<script type="text/javascript">
    var timeRefresh;
    var timeInterval;
    var currentTime;
    var expressTime;

    expressTime = "<%=ExpressDate %>";
    currentTime = "<%=LoginDate %>";
    setCookie("express", expressTime);
    timeRefresh = setInterval("Refresh()", 1000);

    // Refresh this page to check session is expire or timeout.
    function Refresh() {
        var current = getCookie("express");
        var date = current.split(" ")[0];
        var time = current.split(" ")[1];
        var scriptDate = new Date();
        var year = scriptDate.getFullYear();
        var month = scriptDate.getMonth() + 1;
        var day = scriptDate.getDate();
        var hour = scriptDate.getHours();
        var min = scriptDate.getMinutes();
        var second = scriptDate.getSeconds();
        if (Date.UTC(year, month, day, hour, min, second) >=
           Date.UTC(date.split("-")[0], date.split("-")[1], date.split("-")[2],
           time.split(":")[0], time.split(":")[1], time.split(":")[2])) {
            clearInterval(timeRefresh);
            Redirect();
        }
    }

    function Redirect() {
        window.location.replace("Login.aspx?s=ex");
    }

    // Retrieve cookie by name.
    function getCookie(name) {
        var arg = name + "=";
        var aLen = arg.length;
        var cLen = document.cookie.length;
        var i = 0;
        while (i < cLen) {
            var j = i + aLen;
            if (document.cookie.substring(i, j) == arg) {
                return getCookieVal(j);
            }
            i = document.cookie.indexOf(" ", i) + 1;
            if (i == 0) break;
        }
        return;
    }

    function getCookieVal(offSet) {
        var endStr = document.cookie.indexOf(";", offSet);
        if (endStr == -1) {
            endStr = document.cookie.length;
        }
        return unescape(document.cookie.substring(offSet, endStr));
    }

    // Assign values to cookie variable.
    function setCookie(name, value) {
        document.cookie = name + "=" + escape(value);
    }

    function getParameterByName(name) {
        name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
        var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
            results = regex.exec(location.search);
        return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
    }

    $(document).ready(function () {
        if (getParameterByName('s') == 'ex') {
            OpenDialogForSessionExpired();
        }
    })
</script>

【问题讨论】:

  • 你试过 timeout=0 吗?
  • 由于存在会话超时问题,您可以更好地处理 cookie。将 cookie 超时设置为 30 分钟或根据要求。会话即将到期
  • @Nakul,你不能将超时设置为 0
  • 如何设置 cookietimeout?
  • Response.Cookies("SessionID").Expires = DateTime.Now.AddDays(1) // 您可以根据需要设置此cookie,然后用您的会话替换此cookie

标签: javascript c# asp.net web-applications session-timeout


【解决方案1】:

请检查 global.asax 中的 Session_Start。

你设置Session.Timeout = x了吗?

同样对于重定向,你可以使用:

Response.AppendHeader("Refresh", Convert.ToString(Session.Timeout * 60) + ";URL=Login.aspx");

在您的主页 Page_Load 方法中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多