我们平时开发免不了要提交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无法验证通过
....数据提交代码
}