CFTry直到登录成功

时间:2013-11-01 12:12:10

标签: coldfusion try-catch

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

我从来没有使用过CFTry,但是从阅读过它并看了一些例子后我仍无法找到这个问题的答案......

是否可以将整个登录脚本放在CFTry块中,并尝试执行脚本,直到帐户成功登录为止?

3 个答案:

答案 0 :(得分:5)

< cftry>并不像你认为的那样真正起作用。但是当与< cfloop>结合使用时,它仍可用于这种情况。正确使用渔获量。

我有一个类似的问题,我需要检查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响应,它应该是auth还是not,并继续。

答案 1 :(得分:2)

您的计划不太可行,但也可能。 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块中更改哪些内容以便最终成功?

答案 2 :(得分:1)

你可以这样做 - 把你的登录调用放到一个函数中并用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>