我为单页应用创建了登录系统。第一步旅馆登录过程是用户认证。一旦用户登录,他们的会话就会开始。我在服务器端设置了30分钟的会话时间。在客户端,我有JavaScript跟踪何时显示有关其会话时间的警告模式框。但是,只要计算机未处于睡眠模式或移动设备未锁定,这将正常工作。我使用其他方法通过设置JavaScript中每秒运行的间隔来跟踪这些活动,并检查用户上次活动时的差异并比较当前时间。如果差异大于30分钟,我会向他们显示链接以返回登录页面。一切正常,直到我在我的Android手机上打开浏览器并登录。之后我在手机上打开了一些其他应用程序并锁定手机并在30分钟后回来我没有看到我的JavaScript被触发显示用户链接登录页面。相反,我会在同一页面上,例如,如果我点击Submit
按钮发送ajax通话我就会收到错误:File not found Components/Login.cfm
以下是我使用JQuery / Ajax和ColdFusion登录代码的示例:
ColdFusion组件文件:
<cfcomponent output="false">
<cfset this.name = "jqlogin">
<cfset this.sessionManagement = true>
<!--- Run before the request is processed --->
<cffunction name="onRequestStart" returnType="boolean" output="false">
<cfargument name="thePage" type="string" required="true">
<cfset var page = listLast(arguments.thePage,"/")>
<cfif not listFindNoCase("Login.cfm,Auth.cfc",page)>
<cfif not structKeyExists(session, "loggedin") or session.loggedin is false>
<cflocation url="Login.cfm" addToken="false">
</cfif>
</cfif>
<cfreturn true>
</cffunction>
<!--- Runs when your session starts --->
<cffunction name="onSessionStart" returnType="void" output="false">
<cfset session.loggedin = false>
</cffunction>
</cfcomponent>
这是提交表单的JQuery / Ajax代码:
function submitData(){
var frmData = $('#myForm').serialize();
$.ajax({
type: 'POST',
url: 'Components/AjaxFunctions.cfc?method=saveRecord',
data: frmData,
dataType: 'json'
}).done(function(obj){
//successfully submitted
}).fail(function(jqXHR, textStatus, errorThrown){
alert("Error: "+errorThrown);
});
}
我认为问题是一旦服务器会话超时访问任何其他文件,但Login.cfm
和Auth.cfc
受到限制。因此,如果我尝试提交表单,JQuery Ajax调用将在Components文件夹中查找Login.cfm
。我想知道如果Login.cfm
不存在,我可以如何将用户踢回url:Components/AjaxFunction.cfc
?另外我想提一下,一旦会话超时,这将发生在系统中的任何ajax调用。在屏幕上显示警告消息Error: Not found
,如果我检查开发工具ajax响应,我会看到file not found Components/Login.cfm
。如果有人知道这种情况的最佳解决方案,请告诉我。谢谢。
答案 0 :(得分:2)
更改jQuery上的失败,重定向到“登录”页面。
}).fail(function(jqXHR, textStatus, errorThrown){
// This is like an HTTP redirect.
window.location.replace("http(s)://[yourURL]/Login.cfm");
//alert("Error: "+errorThrown);
// Log to console or something if you need to see the error.
});