- if it's important (order form), make sure to use no cache headers and meta tags (both).
- if you need to meta refresh, make the refesh url slightly different by changing some form value.
- treat inbound data as temporary until the final comittment step by the user.
Things not to do:
- expect a user to fill out a snoopy personal form before asking for a cc (leads to huge amounts of bogus data).
- don't disable the back button.
The other approach that I've toyed with is on creation of a form include a hidden timestamp field, in a user table have the timestamp of the last action (or in a cookie, file etc), if they match don't let the action occur. In short I don't think there is a way to do this that doesn't involve additional programming.
BTW. Double posts above? Deliberate or accidental :)
Thats down to the browser. The only way to avoid this is to switch to the GET method (as opposed to POST) in your form. Then you have the problems with limitations of amount of data passed by GET - not good for discussion forums... but maybe appropriate for your application.