我有一个包含 12 步登录过程的 API。登录在大多数情况下都会成功,但有时它会抛出一个错误(通常与 JSON 解析失败有关),这就是尝试的结束。
我从来没有使用过 CFTry,但是通过阅读它并查看示例,我仍然无法找到这个问题的答案......
是否可以将整个登录脚本放在 CFTry 块中,条件是尝试执行脚本,直到帐户成功登录?
我有一个包含 12 步登录过程的 API。登录在大多数情况下都会成功,但有时它会抛出一个错误(通常与 JSON 解析失败有关),这就是尝试的结束。
我从来没有使用过 CFTry,但是通过阅读它并查看示例,我仍然无法找到这个问题的答案......
是否可以将整个登录脚本放在 CFTry 块中,条件是尝试执行脚本,直到帐户成功登录?
<cftry> 并没有像你想象的那样真正起作用。但是当与 <cfloop> 结合并正确使用 catch 时,它仍然可以在这种情况下使用。
我有一个类似的问题,我有 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 解析数据,最多将尝试 3 次。- 只会尝试尽可能多的次数。一旦它得到一个正确的 JSON 响应,它应该要么授权,要么不授权,然后继续。
你的计划不太可能奏效,但它可能奏效。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 块内进行哪些更改以最终成功?
好吧,您可以这样做 - 将您的登录调用放入一个函数中并用 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>