一個B/S系統,瀏覽器的刷新,後退會帶來一些我們不希望看到的錯誤,我們不要這樣,不要這樣嘛~~
1. 刷新帶來的重複提交
問題:例如,要增加一個用戶,從addUser.jsp提交form到uerManagerAction,添加成功後返回到showUser.jsp,這時點擊刷新,會又添加一次數據。
解決方法:使用Token
- /* 跳轉到 “添加管理員” 頁面
- * 使用令牌 */
- saveToken(request);
- return mapping.findForward("addAdminPage");
- <forward name="addAdminPage" path="/WEB-INF/jsp/user/addAdmin.jsp"/>
在addUser.jsp中,會在
- <html:form action="/userManager">
下會自動加上
- <input type="hidden" name="Token" value="...."/>
這樣一句,他的value是根據ID和系統時間自動生成的
- /* 使用令牌避免重複提交 */
- if(!isTokenValid(request)){
- request.setAttribute("msg","請不要重複提交!!!");
- saveToken(request);
- return mapping.findForward("addAdminPage");
- }else{
- resetToken(request);
- }
下面跟上自己的代碼就行了。原理就不寫了,網上很多........
2. 後退到不希望用戶看到的頁面
問題:1)用戶註銷後,點後退鍵又回到登錄後頁面
2)用戶填寫一個form,提交後,點後退鍵又到form頁面,重複提交
解決方法:
對於問題1),首先登陸後給session裏寫入username等信息
- request.getSession().setAttribute("username", name);
- return mapping.findForward("welcome");
- <forward name="welcome" path="/WEB-INF/jsp/user/main.jsp" />
- "text/javascript">
- alert("請先登錄");
- window.location.href="login.jsp";
uerManagerAction.java 註銷action
- // 退出登錄
- // 清空session,結合main.jsp中的判斷,避免退出後點返回又回到登錄後界面
- request.getSession().invalidate();
- return mapping.findForward("logout");
對於問題2)
後退帶來的重複提交的問題,可以和刷新重複提交結合解決。
只要在填寫form的頁面禁用緩存,在加上使用Token,就可以比較好的解決
ok問題解決