防止非法和重复提交

第一,对于不支持POST的,可以简单的使用如下代码

  1. if ("POST".equals(request.getMethod())) {   
  2.   // 正常进行   
  3. }else{   
  4.   // 异常请求   
  5.   out.print("异常访问");   
  6.   return;   
  7. }  

如果是servlet, 可以将doGet方法直接返回,不进行处理就行了

  1. public void doGet(HttpServletRequest request, HttpServletResponse response) {   
  2.   return;   
  3. }   
  4. public void doPost(HttpServletRequest request, HttpServletResponse response) {   
  5.   // 正常进行操作   
  6. }

还可以采用特定的标志来区分,比如
<form><input type="hidden" name="action" value="insert"/></form>
程序里这样判断

 

  1. if ("POST".equals(request.getMethod()) && ("insert".equals(request.getParameter("action")))) {   
  2.   // 正常进行   
  3. }else{   
  4.   // 异常请求   
  5.   out.print("异常访问");   
  6.   return;   
  7. }  

 

 

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

 

  1. if ("POST".equals(request.getMethod())) {   
  2.   String referer = request.getHeader("referer");   
  3.   if (referer == null || !referer.startsWith("http://"+request.getServerName())) {   
  4.     // 非法来源   
  5.     return;   
  6.   }   
  7.   // 正常进行   
  8. }else{   
  9.   // 异常请求   
  10.   out.print("异常访问");   
  11.   return;   
  12. }  

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

  1. //生成一个formhash,算法可以自己定,不随便重复就可以了   
  2. String formhash = MD5.encode(Long.toString(new Date().getTime()));   
  3. //读取当前session里面的hashCode集合,此处使用了Set,方便判断。   
  4. Set<String> formhashSession = (Set<String>) session.getAttribute("formhashSession");   
  5. if (formhashSession == null) {   
  6.   formhashSession = new HashSet<String>();   
  7. }   
  8. // 检测重复问题   
  9. while (formhashSession.contains(formhash)) {   
  10.   formhash = MD5.encode(Long.toString(new Date().getTime()));   
  11. }   
  12. // 保存到session里面   
  13. formhashSession.add(formhash);   
  14. // 保存   
  15. session.setAttribute("formhashSession", formhashSession); 

 表单里面增加如下字段

<input type="hidden" name="formhash" id="formhash" value="<%=formhash%>" />  

 

 

你可能感兴趣的:(算法,session,servlet,null,insert,action)