我的web.config中有会话过期时间,如果用户尝试使用HttpPost,只会在到期时重定向,并且我猜测它会在每个HttpPost之后重置定时器:
<system.web>
<sessionState mode="InProc" timeout="60" />
<compilation debug="true" targetFramework="4.5.1" />
<httpRuntime targetFramework="4.5.1" />
<authentication mode="Forms">
<forms loginUrl="~/Login/Login"></forms>
</authentication>
我在_Layout.cshtml中有这个javascript代码,如果用户空闲,它将重新导入登录,并且我在这里猜测它在ajaxcall之后重置:
<script type="text/javascript">
$(function () {
var _redirectTimeout = 60 * 60 * 1000;
var _redirectUrl = '@Url.Action("Logout", "Login")';
var _redirectHandle = null;
function resetRedirect() {
if (_redirectHandle) clearTimeout(_redirectHandle);
_redirectHandle = setTimeout(function () {
window.location.href = _redirectUrl;
}, _redirectTimeout);
}
//EDIT1
$(document).ajaxComplete(function (event, request, settings) {
if(request.status === 403) {
// reset timer
//resetRedirect();
window.location.href = _redirectUrl; //Im a dumbass, It should be this but it still doesnt work...
}
});
/*$.ajaxSetup({
complete: function () {
resetRedirect();
}
});*/ // reset idle redirect when an AJAX request completes
resetRedirect(); // start idle redirect timer initially.
});
</script>
这使我的两个计时器(都有60分钟)异步,任何想法我怎么能解决这个问题?我想我应该让javascript与HttpPost同步,但我不知道如何... < / p>
EDIT1 我使用JesseJames建议编辑了上面的java脚本代码,并尝试使用下面的代码进行测试,但是resetRedirect();只是没有触发:
$('.save-table').on('click', function () {
var tr = $(this).parents('tr:first');
var PredefName = tr.find("#PredefName").val();
var PredefDescription = tr.find("#PredefDescription").val();
var PredefID = tr.find("#PredefID").html();
tr.find("#lblPredefName").text(PredefName);
tr.find("#lblPredefDescription").text(PredefDescription);
tr.find('.edit-mode, .display-mode').toggle();
$.ajax({
url: '/PredefinedViews/Update/',
data: JSON.stringify({ pID: PredefID, pName: PredefName, pDescript: PredefDescription }),
type: 'POST',
//dataType: "json",
contentType: 'application/json; charset=utf-8',
//success: function (data) {
// alert(data);
//}
//error: function (response) {
// alert(response.responseText);
//},
});
});
我甚至尝试过放置ajaxError而不是ajaxComplete,但它仍然无效,有什么新的建议吗?此外,我意识到我还应该在此eqatuation中包含httpGet请求。
答案 0 :(得分:1)
您可以处理每个ajax响应并检查401代码,这意味着 - 未授权。然后重置你的计时器。
$(document).ajaxComplete(function (event, request, settings) {
if(request.status === 401) {
// reset timer
}
});
您可以尝试处理其他AJAX事件:
Global ajax event handlers in JQuery
我的项目示例:
$(document).ready(function(){
$(document).ajaxError(function (event, jqxhr, settings, exception) {
if (jqxhr.status == 401) {
}
});
});
答案 1 :(得分:0)
您可以处理每个ajax响应并检查403代码即 - 未授权。 如果没有授权,那么你必须重置你的时间