I'm sure I have covered this recently in another
thread, but here it is again.
My favourite solution for this problem is to add a hidden field to the form which has some sort of unique "sequence number", different each time the form is used, generated at the time the HTML for the form is generated. In the code for processing the form, keep track of whether each "sequence number" has been processed yet. If you see one of them again, ignore it - it's a re-send.
It may be that your form already has such a field (invoice number, fault id, whatever ...), if so, you can just use that without any extra hidden fields.