一个B/S系统,浏览器的刷新,后退会带来一些我们不希望看到的错误,我们不要这样,不要这样嘛~~
1. 刷新带来的重复提交
问题:例如,要增加一个用户,从addUser.jsp提交form到uerManagerAction,添加成功后返回到showUser.jsp,这时点击刷新,会又添加一次数据。
解决方法:使用Token
uerManagerAction.java
- /* 跳转到 “添加管理员” 页面
- * 使用令牌 */
- saveToken(request);
- return mapping.findForward("addAdminPage");
struts-config.xml
- <forward name="addAdminPage" path="/WEB-INF/jsp/user/addAdmin.jsp"/>
在addUser.jsp中,会在
- <html:form action="/userManager">
下会自动加上
- <input type="hidden" name="Token" value="...."/>
这样一句,他的value是根据ID和系统时间自动生成的
uerManagerAction.java
- /* 使用令牌避免重复提交 */
- if(!isTokenValid(request)){
- request.setAttribute("msg","请不要重复提交!!!");
- saveToken(request);
- return mapping.findForward("addAdminPage");
- }else{
- resetToken(request);
- }
下面跟上自己的代码就行了。原理就不写了,网上很多........
2. 后退到不希望用户看到的页面
问题:1)用户注销后,点后退键又回到登录后页面
2)用户填写一个form,提交后,点后退键又到form页面,重复提交
解决方法:
对于问题1),首先登陆后给session里写入username等信息
uerManagerAction.java 登录action
- request.getSession().setAttribute("username", name);
- return mapping.findForward("welcome");
struts-config.xml
- <forward name="welcome" path="/WEB-INF/jsp/user/main.jsp" />
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,就可以比较好的解决
addUser.jsp
ok问题解决