如何在ColdFusion中无需逐文件修改即可开关<cflocation>重定向
ColdFusion全局控制重定向的实现方案
以下两种方案均无需修改原有业务代码内的标签,仅需修改Application.cfm和新增1个辅助文件即可实现全局开关控制。
Application.cfm和新增1个辅助文件即可实现全局开关控制。 方案1:自定义标签覆盖内置(最贴合需求,兼容全版本CF)
利用ColdFusion优先调用自定义路径下同名标签的特性,直接替换内置
- 在
Application.cfm中定义全局开关变量,测试时设置为false,正常运行时改为true即可:
<cfset application.enableCflocation = false>
- 在CF的自定义标签目录(默认是项目根目录下的
CustomTags文件夹,不存在可直接新建,也可在CF管理员后台配置自定义标签路径),新建名为cflocation.cfm的自定义标签文件,写入以下逻辑:
<cfif structKeyExists(application, "enableCflocation") AND NOT application.enableCflocation> <!-- 开关关闭时,输出提示不执行跳转,也可自行修改为写日志逻辑 --> <cfoutput> <p style="color:#ff7800;padding:10px;border:1px solid #ff7800;border-radius:4px;"> *已拦截<cflocation>重定向:目标地址 `#attributes.url#`,当前全局重定向开关已关闭* </p> </cfoutput> <cfreturn> </cfif> <!-- 开关打开时,执行原始<cflocation>的逻辑,兼容老旧CF版本 --> <cfif structKeyExists(attributes, "addtoken") AND attributes.addtoken IS false> <cfheader name="Location" value="#attributes.url#"> <cfelse> <cfheader name="Location" value="#urlSessionFormat(attributes.url)#"> </cfif> <cfset statusCode = structKeyExists(attributes, "statuscode") ? attributes.statuscode : 302> <cfheader statuscode="#statusCode#" statustext="Moved Temporarily"> <cfabort>
方案2:onRequestEnd钩子拦截所有重定向响应
覆盖范围更广,除了cfheader设置的跳转:
直接在Application.cfm中添加以下代码即可,全局开关逻辑和方案1一致:
<cfset application.enableCflocation = false> <cffunction name="onRequestEnd" returnType="void"> <cfargument name="targetPage" type="string" required="true"> <cfif NOT application.enableCflocation> <cfset response = getPageContext().getResponse()> <cfif listFindNoCase(response.getHeaderNames(), "Location")> <cfset redirectUrl = response.getHeader("Location")> <!-- 移除重定向头,重置响应状态码为200 --> <cfset response.setHeader("Location", "")> <cfset response.setStatus(200)> <!-- 输出拦截提示 --> <cfoutput> <div style="padding:15px;background:#fff3cd;border:1px solid #ffecb5;border-radius:4px;margin:10px 0;"> 已拦截全局重定向请求,目标地址:`#redirectUrl#` </div> </cfoutput> </cfif> </cfif> </cffunction>
注意事项
两种方案均无侵入性,测试完成后如果要恢复原始逻辑,直接删除新增的自定义标签文件或者移除onRequestEnd方法即可,不需要修改任何业务代码。
内容的提问来源于stack exchange,提问作者PwrSrg
相关产品推荐
相关产品推荐

