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);

来源:http://blog.csdn.net/或http://www.Java2000.net,
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值