涉及到新增使用者(註冊)的功能時,不能使用請求轉發,只能使用重定向
阿新 • • 發佈:2021-08-11
一句話概括原理:
請求轉發會導致功能模組的地址依然是註冊的頁面,只是展示的內容是其他頁面的內容,重新整理頁面時過載的不是其他頁面,而是註冊的頁面,就會導致註冊頁面中所有的方法——包括新增使用者會被重複執行。
例項:
請求轉發時,頁面內容是showUser(新頁面)的內容,但是位址列還是saveUser(舊頁面)的地址,此時執行頁面重新整理時,位址列是舊頁面的地址,就會被重複進入saveUser,而此時請求頭中依然存在表單提交的資料,就會導致資料重複提交
doGet不會提示,直接重複提交資料
doPost會提示,點選確定後也會重複提交資料
下面是測試驗證:
如果使用請求轉發:
在doGet下:
①doGet存在資訊洩露的風險
②頁面顯示的是新頁面內容,但是位址列還是舊頁面的地址
③直接重新整理頁面時,網頁不會提示“表單資料已經被使用過,重複提交可能導致重複操作”,直接再次訪問舊頁面的地址,並且重複讀取請求頭中的資訊重複使用saveUser的新增資料的功能
在doPost下:
①資訊沒有存在位址列上,不存在資訊洩露
②重新整理頁面時會收到提示
③頁面顯示的是新頁面內容,但是位址列還是舊頁面的地址
說明:
①資料不是從位址列拿到的 而是請求中拿到的——doPost下重複重新整理頁面也會導致資料庫重複新增資料
②重新整理不會清除request 使用者提交的表單資訊依然存在——重複重新整理頁面時資料庫重複新增的資料都是同一條
③重新整理時瀏覽器會過載一次位址列,位址列指向的頁面存在的所有方法(無論是doGet還是doPost)都會被重複執行,所以寫在註冊頁面中的新增資料內容也會被重複觸發
如果使用重定向:
在doGet下:
在doPost下:
說明:
①重定向時會改變位址列,連帶著規避掉doGet存在的表單資訊洩露問題
②重定向後,重新整理頁面時瀏覽器過載的是新頁面的地址,不是舊頁面,所以不會重複呼叫saveUserServlet中新增使用者的方法