提示用户并在会话过期时重定向

时间:2014-08-01 18:04:40

标签: c# asp.net session

我在一个页面中有一个按钮,打开一个带有汇率计算器的窗口。 汇率计算器是一种外部Web服务。 可能会发生会话过期但用户仍在页面上并单击打开此类窗口的按钮,而不是计算器,则会显示网站登录页面。 为了避免用户从窗口中的页面登录,我试图检查会话是否仍然存在,如果没有提示用户会话已过期并且他需要再次登录。 为了避免这种情况,尽管警告用户仍然尝试从窗口登录,但是当用户在提示按钮中单击“确定”时,我想停止窗口中的页面加载并重定向到登录页面。

public void Page_Init(object o, EventArgs e)
{
    if (Session ["isUser"] != "isUser")
    {

        ScriptManager.RegisterStartupScript(
        this,
        this.GetType(),
        "Warning",
        "alert('Your session expired! You shall login again.');",
        true);
        Response.Redirect("~/Login.aspx");
    }
}

上述方法有时会显示提示,有时它不会在任何情况下更新到达最后一行以重定向到登录页面。我需要一些帮助才能控制上述情况。如何使上述逻辑有效?我的意思是如果条件不满足,页面没有加载并重定向用户的确定,则显示提示?

3 个答案:

答案 0 :(得分:1)

我刚刚在我的项目中实现了它,它现在可以正常工作:

1)实现一个处理会话的类

 public static class SessionManager
    {


        public static object _Session_UserInfo
        {

            get
            {

                if (HttpContext.Current.Session["isUser"] == null)
                {
                    HttpContext.Current.Response.Redirect("Index?Expired=1");
                    return null;
                }

                else
                {
                    return HttpContext.Current.Session["isUser"];
                }
            }


            set
            {
                HttpContext.Current.Session["isUser"] = value;


            }

        }



    }

// 2)开始引用此calss中的sesison变量:

public void Page_Init(object o, EventArgs e)
{
     //do whatever you wanna do with it, it will automatically redirect if expired
     //SessionManager._Session_UserInfo;


}

//在javascript中执行以下操作:

function getParameterByName(n) {
            var half = location.search.split(n + '=')[1];
            return half !== undefined ? decodeURIComponent(half.split('&')[0]) : null;
        }

        $(document).ready(function () {

            var _IsSessionExpired = getParameterByName("Expired");
          //  alert(_IsSessionExpired);
            if (_IsSessionExpired != null)
                alert('Your Session Has Expired, please login to the system !');
                      window.location="any page you want to redirect to";

        });

您的欢迎

答案 1 :(得分:1)

我终于找到了解决问题的方法。为了避免一个永无止境的循环试图从我需要关闭的窗口重定向,我从用于打开窗口的javascript函数做到了。 所以基本上在我打开窗口之前,我会检查会话是否有效,如果没有,我会在打开它之前重定向。

function openRadWin() {

   var session='<%= Session["isUser"]%>';
   if (session != "isUser") {
   alert("Your Session has expired. Click OK to login again.");
   window.location = "../Login.aspx";
   }

   else {
   var width = "430px";
   var height = "355px";
   var left = "800px";
   var top = "150px";
   radopen("currencies.aspx", "RadWindow1", width, height, left, top);
    }
   }

感谢Wizpert的一些好建议,但我决定尽量减少代码并在几行内完成。

答案 2 :(得分:0)

您可以尝试使用WebMethod使当前登录会话cookie无效的代码,然后向用户提醒会话过期,然后将用户重定向到登录页面。

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication1.WebForm1" %>

    <!DOCTYPE html>

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
    <title></title>
    <script type="text/javascript">
    var HeartBeatTimer;


    function StartHeartBeat()
    {
        if (HeartBeatTimer == null) {
            //timouts after 1 minute
            HeartBeatTimer = setInterval("HeartBeat()", 1000 * 60*1);
        }
    }

    function HeartBeat()
    {
        PageMethods.PokePage(onSucess, onError);
        function onSucess(result) {
            alert('Session Expired');
            window.location = result;
        }
        function onError(result) {
            alert('Something wrong.');
        }
    }
    </script>
    </head>
    <body   onload="StartHeartBeat();">
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true"></asp:ScriptManager>
    <div>

    </div>
    </form>
    </body>
    </html>

和C#代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Services;
    using System.Web.UI;
    using System.Web.UI.WebControls;

    namespace WebApplication1
    {
    public partial class WebForm1 : System.Web.UI.Page
    {
    static int x = 0;
    protected void Page_Load(object sender, EventArgs e)
    {
        HttpCookie hc = new HttpCookie("kk", "kk");
        hc.Expires = DateTime.Now.AddMinutes(5);
        Response.Cookies.Add(hc);
    }
    [WebMethod(EnableSession = true)]
    public static String PokePage()
    {
        HttpCookie hc = new HttpCookie("kk", "kk");
        hc.Expires = DateTime.Now.AddMinutes(-5);
        HttpContext.Current.Response.Cookies.Add(hc);
        return "http://www.google.com";
    }
    }
    }