標籤:網站 servlet car 重複 step tps href form 隱藏
早上花時間補完最後一點小總結:
1、關於 /:可以代表當前WEB 應用的根目錄,也可以代表WEB 網站的根目錄。
1)、/ 如果交給瀏覽器解析,則代表WEB 網站的根目錄;如果交給WEB 伺服器解析,代表當前WEB 應用的根目錄。
2)、代表當前WEB 應用的根目錄:在web.xml 檔案中,映射路徑;請求的轉寄
代表當前WEB 網站的根目錄:超連結的 href 屬性;請求的重新導向中的 /
2、關於絕對路徑:
1)、寫絕對路徑肯定不會有問題,寫相對路徑可能會發生問題。
2)、絕對路徑:相對於當前WEB 應用的路徑。在/ 代表網站根目錄的時候需要在前面加上 contextPath
例如:<form action="<%= request.getContextPath() %>/processStep1" method="post">
例如:response.sendRedirect(request.getContextPath() + "/shoppingcart/step2.jsp");
3、表單的重複提交:
1)、重複提交的情況:
①、在表單提交到Servlet 而Servlet又通過請求轉寄的方式響應了一個 JSP 或HTML 頁面,此時地址欄裡還保留著Servlet 的那個路徑,在響應頁面點擊“重新整理”。
②、在響應頁面沒有到達時,重複點擊“提交按鈕”。
③、點擊“返回”,再點擊“提交”。
2)、不是重複提交的情況:
①、點擊“返回”,“重新整理”原表單頁面,再“提交”。
3)、如何避免表單重複提交
在表單中做一個標記,提交到Servlet 時,檢查標記是否存在且是否和預定的標記一樣。若一致,則受理請求,並銷毀標記;若不一致或沒有標記,則直接響應提示資訊:“重複提交”。
標記,僅提供一個隱藏欄位?行不通。因為 清除標記:沒有方法清除固定的請求參數。
把標記放在 request 中?行不通。因為 表單頁面重新整理後,request 已經被銷毀,再提交表單是一個新的 request。
把標記放在 session 中?可以!思路:
>在原表單頁面,產生一個隨機值token,
>在原表單頁面把token 值放入 session 屬性中
> 在原表單頁面,把token 值放入隱藏欄位中
>在目標的Servlet 中,擷取session 和隱藏欄位中的token 值
> 比較兩個值是否一致,若一致,受理請求且把session 域中的token 屬性清除,若不一致,則響應提示頁面:重複提交。
over。
JavaWeb:HttpSession(二)