2012-03-05 93 views
1

我很茫然。现在,如果用户的会话超时,我的网站将重定向到登录页面。我想解决的一个问题是当用户在登录时点击一个操作按钮时,他们创建一个Ajax请求。 我想在运行ajax调用之前捕获超时,弹出一个模式对话框,提示用户输入用户名和密码,然后在成功登录后进行ajax调用。 我的主要目标是在成功登录后使ajax调用运行,但不一定需要进行弹出,但我认为这将是最佳方式。
我到目前为止所做的是这样的。我创建了一个控制人,他的目的是告诉我是否有超时。在ajaxStart()函数中,我加载了一个调用该控制器的结果的div。如果该div中的html包含单词'Log On',那么我调用window.showModalDialog。这有时可以起作用,有时不起作用。对我来说,这感觉就像一个黑客,并有一个更好的方式来完成它。有任何想法吗??MVC .NET提示用户登录

function ajaxStart() { 
     var timeoutTest = $('#timeoutTest'); 
     timeoutTest.load(timeoutUrl); 
     if (timeoutTest.html().indexOf('Log On') != -1) { 
      window.showModalDialog(logonUrl, "", "dialogHeight: 600; dialogWidth: 400"); 
     } 

     tid = setTimeout(showSpinner, 500); 
    } 

回答

3

我建议你考虑看看其中菲尔哈克说明一种技术,它允许您配置应用程序发送401个状态码,如果验证票证已过期,并请求使用AJAX作出following article 。然后你可以非常轻松地在客户端捕获这个401状态码并显示模态对话框。您甚至可以通过订阅.ajaxError()事件处理程序在全局范围内对页面上发生的所有AJAX请求执行此操作,并在单个位置处理这些错误。

+0

我做了类似于重定向到登录页面的操作。我的目标不是重定向到登录页面。我的目标是让用户在发送ajax请求之前重新登录,然后一旦他们登录到ajax请求就会继续。所以流程如下。 1.用户点击操作。 2.检测到超时。 3.提示用户登录。 4.用户登录。 5.执行操作。 – 2012-03-05 15:04:56

+1

@YetAnotherSoftwareDeveloper,您无法知道身份验证票证是否已过期而未实际发送请求。因此,流程应该是:1.向操作发送请求2.在客户端上检测401状态码3.显示允许用户输入其凭据的模式登录表单4.成功登录后,您将其重定向到他最初请求的页面 – 2012-03-05 15:06:17

+0

我的方法可以让你重新开启你的活动。您只需将“未完成”函数/数据传递给返回requires_auth时处理登录弹出窗口的方法。 – Gats 2012-03-05 15:14:22

1

为什么不添加一个HTML类到#timeoutTest?然后,你可以做

timeoutTest.hasClass('logon'); 
2

的问题用ajax错误重定向到登录页面确实不是一个Ajax错误,您可能需要使用其他的东西。您的登录页面大概不应该总是返回401恕我直言,因为它实际上是一个公共页面。

我确定我的登录页面返回了我可以查找的自定义标题属性。我们使用了大量的AJAX的,你可以有全球性的脚本,看起来它(这将阻止显示页面,让你做你喜欢什么

您的登录页面控制器方法会是什么样子。

public ActionResult LogOn() 
{ 

    Response.AddHeader("REQUIRES_AUTH", "1"); 
    return View(); 
} 

然后在全球范围,你可以有这个jQuery来对付它......

$(document).bind("ajaxComplete", function (event, request, settings) { 
    if (request.getResponseHeader("REQUIRES_AUTH") == "1") { 
     ... addd popup code here. 
    }; 
}); 

PS你并不总是有效的原因是你的超时测试将让用户上岗前赶完了这真的有点抽奖,让ajax完整是o最好的。 (请记住,登录页面仍然是对ajax帖子的有效回复,但不是我们想要的回复)

+0

有趣...这是一个好主意,以赶上超时。如何在用户重新登录后重新运行ajax调用? ajax请求已经完成。 – 2012-03-05 15:21:55

+1

Pubsub值得期待订阅,消防事件。你可以挂钩并且触发一次,然后如果在登录逻辑之后再次失败触发(只要登录响应也是ajax),我喜欢.net安全性和重定向,并且宁愿随时将其留在原位,因为其他解决方案稍后会产生其他问题。诚然,这是一个更复杂的JavaScript解决方案,但我认为401有点冒险,如果您在网站中拥有不同级别的访问权限,甚至可能导致身份验证循环。 – Gats 2012-03-06 04:42:29

+0

+1解释为什么海报的原始方法并不总是有效。 – 2013-07-04 08:56:21