【问题标题】:Throwing error from cfc - cflocation doesn't work from inside onerror()从 cfc 引发错误 - cflocation 在 onerror() 内部不起作用
【发布时间】: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


【解决方案1】:

编辑:对不起,误读了问题...

更新:您可以尝试包含一个模板来处理 cflocation,在 application.cfc 中执行 cflocation 可能是不允许的,因为它发生在请求被触发之前?

应用程序.cfc

 component {

    this.name = 'errorTest';

    public void function onError(required any Exception, required string EventName) {

        include 'errorRedirect.cfm';
    }
}

index.cfm(演示代码有错误)

<cfscript>
a = form.nonExistentVariable;
</cfscript>

errorRedirect.cfm

<cflocation url="error.html">

error.html

<h1>Sorry, An Error has Occurred. </h1>

test.cfc(使用 test.cfc?method=test 测试以演示基于 cfc 的错误)

component {

remote function test () {

    a = form.DoesNotExist;
}
}

【讨论】:

  • Ben,您的意思是在 onError() 方法中进行包含吗?我已经试过了,没有用。
  • 是的,我刚刚提供了一个在 CF9 上对我有用的完整工作示例,我现在无法访问较低版本的 CF 服务器来测试其他人。
  • 本,我们使用的是 Application.cfc,而不是 .cfm。
  • 您能否提供 CFC 的演示以及它引发的错误类型? PS> 是的,application.cfc 很好。也经过测试。按预期工作。
  • 本,没有收到错误 - Chrome 报告页面已加载,并且“网络”窗格中的响应显示正确的 html...但浏览器实际上并未显示更新的 html。跨度>
【解决方案2】:

【讨论】:

  • 这很有趣,但我认为这与这里无关,因为我没有定义 OnRequestEnd()。
【解决方案3】:

如果您使用 AJAX,则除非使用 CF 绑定到 HTML 文档中的 HTML 元素,否则不会显示结果输出。

当您发出 AJAX 请求时,您能否在使用 chrome 的错误页面的响应正文(实体)中看到任何内容?

我认为这是一个 Bluedragon 应用服务器?

【讨论】:

    【解决方案4】:

    我想我的答案在这里:

    Handling Remote API Errors With Application.cfc's OnError Event Method

    我猜我知道的 Ajax 已经够危险了 :(

    我认为让我感到震惊的是,我可以看到 cflocation 确实重定向到错误页面,并且我可以在网络窗格中看到正确的响应;但我没有意识到的是,由于我是远程调用该函数,浏览器将永远不会真正进入新窗口,相反,响应坐在那里等待由 ajax 调用本身处理。我最终会弄清楚这些。

    【讨论】:

    • 这是您问题的解决方案。请记住,AJAX 是客户端。尽管您正在调用服务器函数,除非您将其传递回客户端,否则您永远不会看到服务器端发生了什么。我这是什么意思?如果您在服务器端输出任何内容或执行重定向,除非您在结果中将其传递回客户端,否则您永远不会看到服务器端发生了什么。 (不要忘记将您的问题标记为已回答。)
    • 是的,谢谢,斯蒂芬...必须不断重复自己:客户端,客户端,客户端...。
    猜你喜欢
    • 2015-11-03
    • 2017-12-18
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多