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

 

你可能感兴趣的:(java,String,session,null,insert,action)