关于form页面刷新重复提交的解决方法
2013-03-16 14:12
676 查看
我们平时开发免不了要提交form但是每次页面刷新都会提交一次form这让人很头痛 下面就分享一个简单的解决方法
import java.util.Random;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
public class TokenGen {
private static TokenGen instance = new TokenGen();
private TokenGen() {}
public static TokenGen getInstance() {
return instance;
}
public synchronized boolean isTokenValid(HttpServletRequest request) {
// 没有session,判为非法
HttpSession session = request.getSession(false);
if (session == null)
return false;
// session中不含token,
// 说明form被提交过后执行了resetToken()清除了token
// 判为非法
String stoken = (String) session.getAttribute("token");
if (stoken == null)
return false;
// request请求参数中不含token,
// 判为非法
String rtoken = request.getParameter("token");
if (rtoken == null)
return false;
// request请求中的token与session中保存的token不等,判为非法
return stoken.equals(rtoken);
}
/*
* 重新设置token,当页面被请求后,将session中的token属性去除
*/
public synchronized void resetToken(HttpServletRequest request)
{
HttpSession session = request.getSession(false);
if (session!=null)
{
session.removeAttribute("token");
}
}
/*
* 为请求新建一个token标记,此标记由一个随机的double数toString形成,并把字符值存入session中
*/
public synchronized void saveToken(HttpServletRequest request)
{
HttpSession session = request.getSession(true);
Random rand = new Random();
Double d = rand.nextDouble();
session.setAttribute("token", d.toString());
}
}
然后需要在提交form的jsp页面进行调用
<%@ page language="java" import="java.util.*,com.test.tools.TokenGen" pageEncoding="UTF-8"%>
注意要引入这个类
<%
TokenGen.getInstance().saveToken(request);
String s = (String)session.getAttribute("token");
%>
接下来我们把类产生的也可以说是校验码s跟随form一并提交(方式就类似与登录时候随机生成的验证码一样)
<form action=xxxx.do?a=test" method="post">
<input type="hidden" name="token" value="<%=s%>"/>
</form>
然后我们就在action里面进行验证这个form是不是提交过 如果提交过我们就给出相应提示
TokenGen tokenGen=TokenGen.getInstance();
if (!tokenGen.isTokenValid(request)){
return 验证失败给出提示
}else{
tokenGen.resetToken(request); 说明没有重复提交 这里就把数据保存 然后把校验码清空 否则下次form无法验证通过
....数据提交代码
}
import java.util.Random;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
public class TokenGen {
private static TokenGen instance = new TokenGen();
private TokenGen() {}
public static TokenGen getInstance() {
return instance;
}
public synchronized boolean isTokenValid(HttpServletRequest request) {
// 没有session,判为非法
HttpSession session = request.getSession(false);
if (session == null)
return false;
// session中不含token,
// 说明form被提交过后执行了resetToken()清除了token
// 判为非法
String stoken = (String) session.getAttribute("token");
if (stoken == null)
return false;
// request请求参数中不含token,
// 判为非法
String rtoken = request.getParameter("token");
if (rtoken == null)
return false;
// request请求中的token与session中保存的token不等,判为非法
return stoken.equals(rtoken);
}
/*
* 重新设置token,当页面被请求后,将session中的token属性去除
*/
public synchronized void resetToken(HttpServletRequest request)
{
HttpSession session = request.getSession(false);
if (session!=null)
{
session.removeAttribute("token");
}
}
/*
* 为请求新建一个token标记,此标记由一个随机的double数toString形成,并把字符值存入session中
*/
public synchronized void saveToken(HttpServletRequest request)
{
HttpSession session = request.getSession(true);
Random rand = new Random();
Double d = rand.nextDouble();
session.setAttribute("token", d.toString());
}
}
然后需要在提交form的jsp页面进行调用
<%@ page language="java" import="java.util.*,com.test.tools.TokenGen" pageEncoding="UTF-8"%>
注意要引入这个类
<%
TokenGen.getInstance().saveToken(request);
String s = (String)session.getAttribute("token");
%>
接下来我们把类产生的也可以说是校验码s跟随form一并提交(方式就类似与登录时候随机生成的验证码一样)
<form action=xxxx.do?a=test" method="post">
<input type="hidden" name="token" value="<%=s%>"/>
</form>
然后我们就在action里面进行验证这个form是不是提交过 如果提交过我们就给出相应提示
TokenGen tokenGen=TokenGen.getInstance();
if (!tokenGen.isTokenValid(request)){
return 验证失败给出提示
}else{
tokenGen.resetToken(request); 说明没有重复提交 这里就把数据保存 然后把校验码清空 否则下次form无法验证通过
....数据提交代码
}
相关文章推荐
- easyui关于解决tab添加的页面通过href加载数据内容的页面刷新后form表单重复提交的问题;
- 关于页面刷新,事件重复提交的方法分享
- JSP页面刷新重复提交数据解决方法总结(已验,可行)
- 解决刷新页面造成数据重复提交的方法(转载)
- 页面按F5刷新,避免表单重复提交的解决方法
- form提交刷新页面显示重新提交解决方法
- 用一个最简单方法解决asp.net页面刷新导致数据的重复提交
- 关于页面的防刷新重复提交、防后退解决办法
- 关于页面刷新,事件重复提交
- 关于刷新重复提交的一种解决思路
- 网页防刷新重复提交、防后退解决方法
- 页面按F5刷新重复提交表单数据的解决办法
- javaweb用户注销后点击浏览器返回刷新页面重复登录问题的解决方法
- SubmitOncePage:解决刷新页面造成的数据重复提交问题
- 解决刷新页面造成的数据重复提交问题
- asp.net form标签嵌套 提交页面的解决方法
- JSP刷新页面表单重复提交问题解决办法分享
- 解决刷新页面造成的数据重复提交问题
- 网页如何防止刷新重复提交与如何防止后退的解决方法
- [Jsp]防止页面表单重复提交的解决方法