Java如何防止非法以及重复表单提交的实例介绍与源码分析。第一,对于不支持POST的,可以简单的使用如下代码

if (“POST”.equals(request.getMethod())) {

// 正常进行

}else{

// 异常请求

out.print(“异常访问”);

return;

}
如果是servlet, 可以将doGet方法直接返回,不进行处理就行了。
public void doGet(HttpServletRequest request, HttpServletResponse response) {

return;

}

public void doPost(HttpServletRequest request, HttpServletResponse response) {

// 正常进行操作

}
还可以采用特定的标志来区分,比如

<form><input type=”hidden” name=”action” value=”insert”/></form>
程序里这样判断

if (“POST”.equals(request.getMethod()) && (“insert”.equals(request.getParameter(“action”)))) {

// 正常进行

}else{

// 异常请求

out.print(“异常访问”);

return;

}
第二,判断提交的来源referer,代码如下

if (“POST”.equals(request.getMethod())) {

String referer = request.getHeader(“referer”);

if (referer == null || !referer.startsWith(“http://”+request.getServerName())) {

// 非法来源

return;

}

// 正常进行

}else{

// 异常请求

out.print(“异常访问”);

return;

}
第三 防止重复提交的hashCode
在表单显示页面

//生成一个formhash,算法可以自己定,不随便重复就可以了

String formhash = MD5.encode(Long.toString(new Date().getTime()));

//读取当前session里面的hashCode集合,此处使用了Set,方便判断。

Set<String> formhashSession = (Set<String>) session.getAttribute(“formhashSession”);

if (formhashSession == null) {

formhashSession = new HashSet<String>();

}

// 检测重复问题

while (formhashSession.contains(formhash)) {

formhash = MD5.encode(Long.toString(new Date().getTime()));

}

// 保存到session里面

formhashSession.add(formhash);

// 保存

session.setAttribute(“formhashSession”, formhashSession);
表单里面增加如下字段

<input type=”hidden” name=”formhash” id=”formhash” value=”<%=formhash%>” />
在表单提交页面进行如下处理

// 拿到表单的formhash

String formhash = upload.getParameter(“formhash”);

// 拿到session里面的集合

Set<String> formhashSession = (Set<String>) session.getAttribute(“formhashSession”);

// 如果没有,则是重复提交,或者非法提交

if (formhashSession == null || !formhashSession.contains(formhash)) {

out.println(“请不要重复提交!”);

return;

}

// 下面进行其它的操作

//

// 最后,如果操作成功,从session里面把这个formhash 删掉!

// 以免用户少填写了某个字段,造成表单无法再次提交

formhashSession.remove(formhash);

session.setAttribute(“formhashSession”, formhashSession);