PDA

View Full Version : سوال: تشخيص Refresh در صفحه



Neeloofar
سه شنبه 12 مرداد 1389, 10:09 صبح
سلام
من يك فرم رو به صفحه ديگه‌اي پست ميكنم. در فرم دوم با استفاده از متغييرهاي فرم قبلي يك سري كدها توليد ميشه.
ولي اگر كاربر در صفحه دوم كليد Refresh رو بزنه دوباره كدها توليد ميشن و يك ديگه نمايش داده ميشه.
ميخوام اگر كاربر صفحه رو Refresh كرد، تشخيص داده بشه و اصلا كدها توليد نشن و يك پيام خطا صادربشه يا اينكه متغييرهايي كه از فرم قبلي پست شدند پاك بشن.
چكار بايد كنم.
با تشكر.

eshpilen
سه شنبه 12 مرداد 1389, 10:44 صبح
تاجایی که متوجه شدم شما میخواید از ارسال مجدد فرمی که کاربر قبلا ارسالش کرده جلوگیری کنید (یا درواقع این رو تشخیص بدید).
چند راه بصورت ترفند وجود دارن که میتونن از رفرش شدن صفحه توسط کاربر جلوگیری کنن و قبلا بحثش رو در فروم دیگری داشتیم.
ولی یک راه که از طریق کد سمت سرور باشه و بنده پیشنهاد کردم (و کسی که این مشکل رو داشت اون رو پیاده سازی کرد و گفت موفقیت آمیز بوده)، اینه که شما در فرم خودتون که به کاربر ارسال میکنید یک ورودی از نوع hidden قرار بدید و مقدارش هم یک رشتهء رندوم باشه. مثلا یک رشتهء رندوم 40 کاراکتری.
بطور مثال کد تولید شده در فرم ارسال شده به کاربر شامل این ورودی hidden میشه:

<input type="hidden" name="form_id" value="dhjfljf689449shkdfcmvkhd">در قسمت value مثلا یک رشتهء رندوم داریم.
حالا، اگر کاربر این فروم رو ارسال کنه، هربار این form_id هم به سرور ارسال میشه و بنابراین میشه تشخیص داد که این بار اول هست یا بارهای بعدی که یک فرم خاص ارسال شده، و شما میتونید از پذیرش فرم ارسال شده در بارهای دوم و بعدی امتناع کنید و احتمالا پیام هشدار یا خطایی به کاربر بدید. شما احتمالا form_id رو در سشن کاربر ذخیره خواهید کرد.
شما هربار هنگام بارگذاری صفحهء فرم در مرورگر کاربر، باید یک رشتهء رندوم جدید تولید کنید و به این فیلد اختصاص بدید. ضمنا قرار دادن هدرها و متاتگ های ضدکش در صفحهء این فرم فراموش نشه.
اگر جلوگیری از ارسال مجدد فرم خیلی مهم هست و عدم تشخیص ارسال مجددش حتی در یک مورد از هر چند ده مورد مشکل بزرگی محسوب میشه، توصیه میکنم بجای سشن از روش دیگری مثل ذخیره در دیتابیس استفاده کنید، چون سشن ها میتونن بصورت ظاهرا تصادفی از بین برن (بطور مثال اگر مدت زمان خاصی از آخرین فعالیت کاربر بگذره).
فقط باید یه مکانیزم برای پاکسازی دیتابیس از رشته های رندوم خیلی قدیمی هم پیاده کنید.