coldfusion - 关于ColdFusion的CGI范围/结构的未记录的不一致行为

标签 coldfusion coldfusion-9 coldfusion-10 coldfusion-11 coldfusion-2016

我最初将其发布为对此问题的答案,有关Empty CGI.REDIRECT_URL on ColdFusion 2016的信息。考虑了一下之后,我想到了更好的选择,因为从技术上讲,它并没有回答OP的问题。相反,我决定将其变成一个单独的问题,即使它更多地是评论而不是问题。尽管从技术上讲这可能无法满足Minimal, Complete, and Verifiable example的全部要求,并且人们可能会向我投降票,但我还是认为值得这样做,希望它对于将来可能遇到此问题的CFers来说,找到变得更加容易。这样就可以防止他们因CGI结构/范围的这种特殊行为而使头撞墙。

话虽如此,CGI结构/作用域具有其他结构/作用域的一些未记录的不一致行为。请注意,由于我是前一段时间在阅读Ben Nadel's blog post on this时发生的,因此我个人对此发现不屑一顾。因此,我在此处发布的所有信息已经在此处进行了详细说明,但是我想在此处写一个不错的摘要。

Undocumented behavior 1 - Unlike other structures, if a CGI struct key doesn't exist, then it won't throw an error when referencing it.



OP's original question中,他想知道为什么cgi.REDIRECT_URL存在但为空。正如他最终发现的那样,它实际上从未存在过。作为一个单独的示例,您可以执行此行代码而不会引发错误。不是您所期望的,是吗?
<cfoutout>#cgi.THIS_IS_A_FAKE_KEY#</cfoutout>

那么CFer怎么办?测试 key 是否存在。
<cfif structKeyExists( CGI, 'THIS_IS_A_FAKE_KEY' )>
    THIS_IS_A_FAKE_KEY exists
<cfelse>
    THIS_IS_A_FAKE_KEY doesn't exist
</cfif>

Undocumented behavior 2 - Unlike other structures, if you dump the CGI struct, it won't display all the key/value pairs, it will only display a defined set of keys.



OP's case中,他有一个自定义的Apache CGI变量cgi.REDIRECT_URL,该变量在升级到CF2016之前已在他的代码中使用,并且可以直接引用它。但是,我想如果他转储了cgi结构,它就不会出现在转储中。在Ben Nadel's case中,他还具有一个称为cgi的自定义cgi.document_root变量,该变量从负载均衡器传递并可以直接引用它,但在转储cgi内容时他也看不到 key 。

那么CFer怎么办?了解这一点并将其存储在您的脑海中,这样当您转储cgi内容并且键/值对不存在时,您就不会被咬住。除此之外,没有什么其他的了。

最佳答案

我进入了ColdFusion的cfusion.jar文件。我发现那里有些困惑。
CGI范围不是人们希望的structure形式。
这就是处理CGI变量的方式。例如<cfoutout>#cgi.THIS_IS_A_FAKE_KEY#</cfoutout>

  • 正常的有效CGI范围变量是此列表中的变量,默认情况下,它们将被初始化为""
     private static final String[] names ="AUTH_PASSWORD","AUTH_TYPE","AUTH_USER","CERT_COOKIE","CERT_FLAGS","CERT_ISSUER","CERT_KEYSIZE","CERT_SECRETKEYSIZE","CERT_SERIALNUMBER","CERT_SERVER_ISSUER","CERT_SERVER_SUBJECT","CERT_SUBJECT","CF_TEMPLATE_PATH","CONTENT_LENGTH","CONTENT_TYPE","CONTEXT_PATH","GATEWAY_INTERFACE","HTTP_ACCEPT","HTTP_ACCEPT_ENCODING","HTTP_ACCEPT_LANGUAGE","HTTP_CONNECTION","HTTP_COOKIE","HTTP_HOST","HTTP_USER_AGENT","HTTP_REFERER","HTTP_URL","HTTPS","HTTPS_KEYSIZE","HTTPS_SECRETKEYSIZE","HTTPS_SERVER_ISSUER","HTTPS_SERVER_SUBJECT","LOCAL_ADDR","PATH_INFO","PATH_TRANSLATED","QUERY_STRING","REMOTE_ADDR","REMOTE_HOST","REMOTE_USER","REQUEST_METHOD","SCRIPT_NAME","SERVER_NAME","SERVER_PORT","SERVER_PORT_SECURE","SERVER_PROTOCOL","SERVER_SOFTWARE","WEB_SERVER_API" };`
    
    同样,所有这些值也来自各种Java库javax.servletHttpServletRequest等。
  • 如果经过一番检查后,所请求的变量不是这些变量中的任何一个,则ColdFusion转到请求 header 。您可以使用getHttpRequestData().headers查看这些内容。然后在其中查找带有连字符(-)的 key ,而不是_ key 请求中的下划线(cgi)。 (如果 key 以http_开头,那么请求 header 中的 key 将不存在,就像请求 header 中的http_x_forward将是x-forward一样)
     value = request.getHeader(name.replace('_', '-'));
    

  • 据我了解,就ColdFusion而言,第一点提到的键被认为是CGI范围的一部分。但是,当有其他信息从Apache负载平衡器服务器传递到ColdFusion时,这些信息最终会出现在请求 header 中。由于java getHeader仅返回空字符串(或数据类型为undefined的东西)而不是未定义的错误,因此ColdFusion不会标识是否已定义任何键。
    因此,如果 key THIS_IS_A_FAKE_KEY是从诸如Apache服务器之类的中介发送到ColdFusion的。您会在getHttpRequestData().headers['THIS-IS-A-FAKE-KEY']中找到它,但在CGI范围转储中找不到。
    话虽如此,我个人的观点是,最好直接在getHttpRequestData().headers中检查自定义CGI变量,而不是在范围本身中。

    关于coldfusion - 关于ColdFusion的CGI范围/结构的未记录的不一致行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48799523/

    相关文章:

    javascript - 使用 javascript 控制 CFINCLUDE 文件

    coldfusion - 如何比较两个列表元素?

    coldfusion - 使用 ColdFusion 框架

    javascript - 处理 JQuery ajax 成功对象数据

    types - CF9 中的 QueryNew() 数据类型

    coldfusion - 使用 ColdFusion 10 合并单元格后如何在 cfspreadsheet 中进行顶部对齐

    coldfusion - REST Web 服务 404 未找到 - ColdFusion 11

    ColdFusion DirectoryList () - 是否可以只获取目录?

    unicode - ColdFusion cfmail 主题行中的特殊字符

    rest - ColdFusion 10 REST API UTF-8 字符