我得到的错误是:
Element USER is undefined in a Java object of type class [Ljava.lang.String;
我得到这个错误的代码行是当我做这样的事情时:
SESSION.user.functionName()
它是随机的,我假设在用户的会话过期后发生。我的问题首先是,SESSION
范围始终不是一个结构吗? ColdFusion如何/为什么认为它是一个字符串。
无论如何,我的主要问题是我使用的是CFWheels。我的所有控制器当然都扩展了主Controller.cfc
,我的所有控制器(公共控制器除外)都通过checkLogin
函数进行过滤。该功能有这个:
<cfif !structKeyExists(session, "user")>
<cfif !structKeyExists(params,'layout') || params.layout EQ true>
<cfset redirectTo(route="home",error="You must be logged in to continue.") />
<cfelse>
<cfset flashInsert(error="You session has expired and you must login to continue. <a href=''>Reload the Page</a> to login.") />
<cfset redirectTo(controller="Shared",action="ajaxError") />
</cfif>
</cfif>
在此功能的这一部分中,我明确检查user
中是否存在session
,如果它不是这样或那样,我将其发送到其他地方。当session
以某种方式成为字符串时,代码如何通过此部分然后失败?
更不用说在我到达错误行之前还有其他各种各样的地方,我确保SESSION.user对象中的各种内容都是正确的。
答案 0 :(得分:0)
发生了什么是关于ajax请求。一些ajax请求加载报告,这可能需要几秒钟来查询,特别是在一些缓存发生之前。如果用户执行ajax调用然后注销,从技术上讲,请求可以通过我的所有权限检查到达控制器(只需几毫秒),但在控制器中从用户注销的模型中获取数据时。
然后在视图准备好加载时,会话被清除。如果我在会话范围内使用任何内容,则会出错。
我想我会通过添加一个在控制器操作之后运行的过滤器来检查会话范围是否仍在那里来解决这个问题。如果不是,我只是中止请求。我的任何视图中都没有模型逻辑,但我有时会引用SESSION.user
范围内的方法。可能不是纯粹的MVC。
在控制器的某些部分完成之前发生注销的情况下,我会让这些错误尽可能地发生并忽略它们,因为知道用户确实没有看到它发生。