Coldfusion CFTry直到登录成功

Coldfusion CFTry直到登录成功,coldfusion,try-catch,Coldfusion,Try Catch,我有一个API,它有一个12步的登录过程。登录大部分时间都会成功,但偶尔会抛出错误(通常与JSON解析失败有关),这就是尝试的结束 我从未使用过CFTry,但通过阅读和查看示例,我仍然无法找到这个问题的答案 是否可以将整个登录脚本放在CFTry块中,条件是在帐户成功登录之前尝试执行脚本?您的计划不太可能有效,但可能有效。cftry/cfcatch的工作原理如下 <cftry> code <cfcatch> code that runs if there is an

我有一个API,它有一个12步的登录过程。登录大部分时间都会成功,但偶尔会抛出错误(通常与JSON解析失败有关),这就是尝试的结束

我从未使用过CFTry,但通过阅读和查看示例,我仍然无法找到这个问题的答案


是否可以将整个登录脚本放在CFTry块中,条件是在帐户成功登录之前尝试执行脚本?

您的计划不太可能有效,但可能有效。cftry/cfcatch的工作原理如下

 <cftry>
 code
 <cfcatch>
 code that runs if there is an error.
 </cfcatch>
 </cftry>

代码
发生错误时运行的代码。
如果您想再试一次,可以将该代码块放入循环中

 <cfset success = "false">
 <cfloop condition= "success is 'false'">
 <cftry>
 code
 <cfset success = "true">

 <cfcatch>
 code that runs if there is an error.
 it has to change something since this is in a loop
 </cfcatch>
 </cftry>

代码
发生错误时运行的代码。
它必须改变一些东西,因为这是一个循环
但是,如果您的错误是json解析,那么为了最终成功,您将在cfcatch块中更改哪些内容?

并不像您想象的那样工作。但在这种情况下,如果与适当使用渔获物相结合,它仍然可以使用

我有一个类似的问题,我有3个身份验证服务器需要检查。如果第一个失败,则检查第二个,如果第二个失败,则检查第三个。我通过循环来实现这一点

现在,我当然不建议您“尝试直到成功”,除非您喜欢在发生意外事件时让服务器屈服的想法。但是您可以做类似于这个伪CFML的事情

<cfloop from="1" to="3" index="authIndex">
    <cftry>
        <!--- Check JSON parsing result --->
        <cfif NOT isJSON(jsonData)>
            <cfthrow type="badJSON" message="JSON Parsing failure" />
        <cfelse>
            <cfset userData = deserializeJSON(jsonData) />
        </cfif>

        <cfif authUser(userData.userInfo, userData.userpassword)>
            <cfset session.user = {} />
            <cfset session.user.auth = true />
            <!--- whatever other auth success stuff you do --->
        <cfelse>
            <cfthrow type="badPassOrUsername" message="Username of password incorrect" />
        </cfif>

        <!--- If it makes it this far, login was successful. Exit the loop --->
        <cfbreak />

        <cfcatch type="badPassOrUsername">
            <!--- The server worked but the username or password were bad --->
            <cfset error = "Invalid username or password" />

            <!--- Exit the loop so it doesn't try again --->
            <cfbreak />
        </cfcatch>

        <cfcatch type="badJSON">
            <cfif authIndex LT 3>
                <cfcontinue />
            <cfelse>
                <!--- Do failure stuff here --->
                <cfset errorMessage = "Login Failed" />
                <cflog text="That JSON thing happened again" />
            </cfif>
        </cfcatch>
    </cftry>
</cfloop>

上述守则将: -如果用户名或密码不正确,请仅尝试一次 -如果发生JSON解析数据,将尝试最多三次。
-将只尝试它需要的次数。一旦它得到正确的JSON响应,它应该要么进行身份验证,要么不进行身份验证,然后继续操作。

您可以这样做-将登录调用放入函数中,并用try-catch块包围它,在catch块中调用main函数,直到成功为止。它多多少少像一个递归函数,并且它有自己的陷阱,比如进入永无止境的循环并关闭服务器。但您可以通过在应用程序/会话范围中设置计数器或类似的设置来缓和这种情况

 <cffunction name="main">

    <cftry>
        <cfset success = login()>
    <cfcatch>
        <cfset main()>
    </cfcatch>
    </cftry>

  </cffunction>

  <cffunction name="login">
    <!--- Do login stuff here --->
  </cffunction>


在任何人开始尝试回答此问题之前,您需要提供一些代码。为什么不使用布尔值表示
false
,而不是将其作为字符串键入
JSON解析错误很奇怪,同一个请求在大多数情况下都有效,但偶尔会返回此错误,但我重新提交页面后,它通常会再次成功,因此我认为,只要尝试脚本,直到设置Session.loggedIn变量,可能就可以完成任务,因为您提出了要求,我认为条件=“成功是错误的”比条件=更可读。但是,正如您所指出的,我不需要将变量设置为字符串。我只是习惯于引用任何不是数字的东西。Jason我认为这让事情变得更清楚了,因为我将循环CFHTTP调用,该调用将返回JSON响应X次,如果最坏的情况是每次都出现JSON错误,那么我会将重载变量设置为true(对于其他响应,我会这样做)否则我将继续使用较少的脚本。谢谢你的帮助。是的,我已经有了一个会话变量,它决定了总的登录尝试次数,如果达到4次,它会休眠30分钟,然后再试一次,这样就可以处理无休止的循环。谢谢你的帮助