I have a three step form where each step posts to it's own action; the action redirects to the next step. The data is stored in the session scope. I have a filter that prevents a user from accessing the form handlers through anything other than a post request.
There's nothing to stop someone from manually typing in the address of a step, however. To deal with this problem I set a currentStep variable in the session.
<!--- Some data is processed here --->
<cfset session.currentStep = "stepTwo">
And in step two I would check for a structkey:
<cfif NOT session.currentStep = "stepTwo">
<!--- redirect to #session.currentStep# --->
This approach works well, but it has a major draw-back: A user can not press the back button in the browser window, or edit any data he or she has already entered.
What are some the best practices to implementing a multi-step form? Can I improve my process to incorporate back-button functionality?