Java防止非法和重複表格單提交的分析

來源:互聯網
上載者:User
第一,對於不支援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,

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.