您的位置:首页 > 其它

关于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无法验证通过

....数据提交代码

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: