您的位置:首页 > 编程语言 > Java开发

Java防止非法和重复表单提交的分析

2008-02-28 09:41 441 查看
第一,对于不支持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);

以上内容为本人原创内容,如要转载,请保留完整信息。并注明来源为http://blog.csdn.net/或http://www.Java2000.net,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: