【发布时间】:2012-01-27 20:12:01
【问题描述】:
编辑:一个重要的部分可能是我正在通过 ajax 调用 cfc 方法...
我正在通过 ajax 调用 cfc 方法,该方法返回用于 jqgrid 表的数据。在 cfc 的方法中,我试图设置错误处理,这样我就不会只是失败并且不给用户任何问题的指示,而是将用户发送到一个错误页面,该页面在根目录中定义为 error.cfm , 现在只包含一些样板 html。 在 Application.cfc 中,我定义了我的 onError() 方法,如下所示:
<cffunction name="onError" returnType="void" output="false" >
<cfargument name="exception" required="true" >
<cfargument name="eventname" type="string" required="true" >
<cfmail to="#application.REGISTRATION_NOTIFICATION#" from="outgoing address" subject="Error">
</cfmail>
<cflocation url="../index.cfm?file=error.cfm" addToken="false" />
当我从 cfc 的方法中抛出一个错误时,无论是否在 cfcatch 中,Chrome 都会报告我确实已被发送到 index.cfm,并且 STATUS=200,并且响应正确地显示了其中的 html error.cfm 模板。但是,浏览器实际上并没有转到该页面。
问题是,如果我将位置更改为
<cflocation url="index.cfm?file=error.cfm" addToken="false" />
并从调用 cfc 的页面中抛出错误,而不是从 cfc 中,cflocation 确实按预期工作。此外,如果我使用 cfinvoke 从原始页面调用 cfc,而不是使用 ajax 调用,则 cflocation 可以工作。所以这一定与我通过ajax调用cfc而不是从CF中调用它的事实有关。那么我在这里错过了什么?
附言这发生在 Chrome、IE 和 FF 中。我正在使用带有修补程序的 CF 9.0.1,没有框架。下面是来自 Chrome 网络窗格的输出的子集,位于标头中,用于引用页面:
请求网址:http://localhost/sitename/cfc/method.cfc
请求方法:GET
状态代码:302 暂时移动
Request Headers 查看源代码
Accept:application/json, text/javascript, /; q=0.01
接受字符集:ISO-8859-1,utf-8;q=0.7,*;q=0.3
接受编码:gzip、deflate、sdch
Accept-Language:en-US,en;q=0.8
连接:保持活动状态
Cookie:CFID=11801; CFTOKEN=90037336;最后访问=1327852981759
主机:本地主机
引用者:http://localhost/sitename/index.cfm?file=referringfile.cfm
用户代理:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML,如 Gecko)Chrome/16.0.912.77 Safari/535.7
X-Requested-With:XMLHttpRequest
查询字符串参数视图 URL 编码
方法:getPartNumbers
过滤器:{"page":1,"sessionSQL":"1327834969791","filterRows":[{"FIELD_NAME":"PART_NUMBER","OPERAND":"EQUALS","FIELD_VALUE":"11 06 01"}]}
_搜索:假
nd:1327835014639
行数:100
第 1 页
sidx:PART_NUMBER
sord:desc
响应标头查看源代码
内容类型:文本/html; charset=UTF-8
日期:2012 年 1 月 29 日星期日 11:03:34 GMT
位置:../index.cfm?file=error.cfm
持久验证:真
服务器:Microsoft-IIS/7.5
Set-Cookie:LASTVISIT=1327853014657;expires=Fri, 27-Jul-2012 11:03:34 GMT;路径=/
传输编码:分块
X-Powered-By:ASP.NET
对于error.cfm页面:
请求网址:http://localhost/sitename/index.cfm?file=error.cfm
请求方法:GET
状态码:200 OK
Request Headers 查看源代码
Accept:application/json, text/javascript, /; q=0.01
接受字符集:ISO-8859-1,utf-8;q=0.7,*;q=0.3
接受编码:gzip、deflate、sdch
Accept-Language:en-US,en;q=0.8
授权:协商 哈哈哈哈哈哈
连接:保持活动状态
Cookie:CFID=11801; CFTOKEN=90037336;最后访问=1327716554490
主机:本地主机
引用者:http://localhost/sitename/index.cfm?file=filename/filename.cfm&Config=filename
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.77 Safari/535.7
X-Requested-With:XMLHttpRequest
查询字符串参数视图 URL 编码
文件:error.cfm
响应标头查看源代码
内容类型:文本/html; charset=UTF-8 日期:2012 年 1 月 27 日星期五 21:09:14
GMT Persistent-Auth:true 服务器:Microsoft-IIS/7.5
Set-Cookie:LASTVISIT=1327716554533;expires=Wed, 25-Jul-2012 21:09:14 GMT;path=/
传输编码:分块
X-Powered-By:ASP.NET
【问题讨论】:
-
没有注明,但请说明什么版本和什么样的CF? Abode、Railo、Blue Dragon 等,所以其他人可能有更多的见识。其次,绑定位置 url="/index.cfm?file=error.cfm" 有效吗?
-
请执行此操作:在 Google Chrome 中,转到菜单(扳手),选择工具 -> 开发人员工具;一个窗格将在您的页面下方打开。单击第三个选项卡(网络),然后...重新运行您在 CFC 中引发错误的测试。截取网络活动的屏幕截图并将其添加到您的问题中。
-
有一个重定向 onError 是一个坏主意 - 你正在为自己设置一个无限循环。如果您的 application.cfc/application.cfm 或您要重定向到的文件出现任何问题,循环将开始无限重复。相反,您应该包含一个错误模板以避免这种命运。您需要在此文件中发生错误时应生成的所有 HTML。
-
我有兴趣查看 302 重定向,这在您更新的问题中没有出现,也没有出现在下面答案的讨论中。我在本地设置了一个测试,在 CFC 中抛出了一个错误,并正确触发了 cflocation,并注意到网络流量中的 302,但您的没有显示,这意味着其他东西正在中断它。
-
Shawn,我添加了显示 302 重定向的输出。
标签: coldfusion cfc onerror