我有一個有12個步驟的登錄過程的API。登錄成功大部分時間,但它會一次又一次地拋出一個錯誤(通常與JSON解析失敗有關),這是嘗試的結束。CFTry直到登錄成功
我從來沒有用過CFTry但是從已經讀了它,看着例子我仍然無法找到這個問題的答案...
是否有可能把這個整個登錄腳本中在嘗試執行腳本的條件CFTry塊,直到帳戶已成功登錄?
我有一個有12個步驟的登錄過程的API。登錄成功大部分時間,但它會一次又一次地拋出一個錯誤(通常與JSON解析失敗有關),這是嘗試的結束。CFTry直到登錄成功
我從來沒有用過CFTry但是從已經讀了它,看着例子我仍然無法找到這個問題的答案...
是否有可能把這個整個登錄腳本中在嘗試執行腳本的條件CFTry塊,直到帳戶已成功登錄?
<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響應,它應該授權或不授權並繼續。
Jason我認爲這已經讓事情變得更清楚了,因爲我將圍繞CFHTTP調用循環,該調用返回X次的JSON響應,並且如果最壞的情況每次都有一個JSON錯誤,那麼我將設置一個reload變量爲true (我對其他答案做了什麼),否則我會繼續使用較少的腳本。謝謝你的幫助。 – CPB07
你的計劃不大可能奏效,但它可能。 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塊內改變,使你最終會成功嗎?
爲什麼不使用布爾值作爲'false'而不是將它作爲字符串輸出? '
JSON解析錯誤很奇怪,同一個請求在大部分時間都有效,但是一次又一次地返回這個錯誤,但是我重新提交它的頁面然後通常再次成功,所以我認爲只是嘗試腳本,直到它達到一個Session.loggedIn變量設置的點可能會做的工作 – CPB07
因爲你問,我認爲條件=「成功是'假''是比條件更可讀=不成功。然而,正如你所指出的那樣,我不需要把變量變成一個字符串。我只是習慣於引用任何不是數字的東西。 –
那麼你可以這樣做 - 把你的登錄調用放入一個函數,並用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>
是的,我已經得到了一個Session變量,它決定了整個登錄嘗試的次數,如果它達到4,那麼它會再次嘗試30分鐘,然後再次嘗試,以便處理無限循環。謝謝你的幫助 – CPB07
在任何人甚至可以開始嘗試並回答這個問題之前,您需要提供一些代碼。 –