我在一个页面中有一个按钮,打开一个带有汇率计算器的窗口。 汇率计算器是一种外部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");
}
}
上述方法有时会显示提示,有时它不会在任何情况下更新到达最后一行以重定向到登录页面。我需要一些帮助才能控制上述情况。如何使上述逻辑有效?我的意思是如果条件不满足,页面没有加载并重定向用户的确定,则显示提示?
答案 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";
}
}
}