`
逆风的香1314
  • 浏览: 1416804 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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,
分享到:
评论

相关推荐

    Java表单重复提交的避免方法

    Java表单重复提交是Web开发中常见的问题,可能导致数据不一致和系统异常。要理解这个问题,首先要明白表单提交的基本流程:用户打开表单页面,填写信息,然后点击提交按钮,浏览器向服务器发送请求,服务器处理请求...

    防止页面的重复提交和刷新

    在多步骤的表单提交过程中,如果用户在完成某个步骤后选择后退并重新提交,可能会导致之前步骤中的数据丢失或覆盖。例如,在投票系统中,用户在完成投票后返回上一步并重新投票,会导致投票结果出现偏差。 #### 三...

    防重复提交代码

    2. **Token验证**:当接收到表单提交请求时,先检查Token是否有效。 ```java if (!this.isTokenValid(request) && (int) state &gt; 0) { this.saveToken(request); } else { // 处理业务逻辑 session....

    Struts解决重复提交步骤

    1. **在表单提交前生成令牌**: ```java saveToken(request); ``` 2. **在提交表单的方法中验证令牌**: ```java if(!isTokenValid(request)){ ActionMessages errors = new ActionMessages(); errors.add(...

    一种Java Web数据提交中的防刷新令牌.pdf

    本文分析了现有的处理方式的不足,讨论了如何通过基于会话的服务器令牌和基于请求的客户令牌,有效防止刷新处理,避免数据的重复提交。 一、表单提交数据的安全问题 在 Java Web 应用系统中,通过表单提交数据是一...

    struts的令牌机制,防止重复提交

    1. **使用统一的方法**:为所有涉及表单提交的Action创建统一的方法来处理令牌的生成和验证。 2. **错误处理**:对于验证失败的情况,应该给出明确的错误提示,告知用户发生了什么问题。 3. **避免使用GET方式提交**...

    Java实训教程 Java软件开发实战 Java开发框架介绍 struts2_表单校验失败跳input视图问题共13页.pptx

    在Web应用开发中,表单校验是非常重要的环节之一,能够有效防止非法数据的提交,提高系统的安全性与稳定性。Struts2提供了一套完整的表单校验机制,包括但不限于客户端验证、服务器端验证以及自定义验证规则等。 ##...

    struts2token回退刷新

    如果不匹配或者令牌不存在,那么表单提交将被拒绝,以此来防止重复提交或非法请求。 4. **令牌回退**:当表单提交成功后,为了防止用户意外刷新页面导致重复提交,Struts2会清除服务器会话中的令牌。这种行为称为...

    Java实现验证码验证功能

    在IT行业中,验证码验证功能是网站和应用程序安全的重要组成部分,它可以防止恶意自动化脚本或机器人进行非法操作。本文将深入探讨如何使用Java编程语言来实现验证码验证,主要涉及Servlet、session以及画板对象等...

    爬虫javaDemo

    1. **网页登录**:有些网站需要登录才能访问,Java爬虫需要模拟登录过程,可能涉及POST提交表单、处理验证码等。 2. **动态加载内容**:现代网页常使用AJAX技术,部分内容动态加载,需使用Selenium、Puppeteer等...

    java工具类——验证码(VerifyCode)

    - 为了防止重复刷新导致验证码改变,可以使用`session`对象存储当前的验证码内容,同时在客户端通过JavaScript获取图片的`src`,并在表单提交时一并发送验证码值。 4. **验证过程** - 客户端输入验证码后,将其值...

    java web考试报名系统

    系统可能利用jQuery进行表单提交和数据验证,确保信息完整且符合规范。同时,系统通过邮箱验证机制来增加安全性,防止恶意注册或误操作。这里会用到邮件注册的功能,系统向考生提供的邮箱发送一封包含UUID(无重复的...

    kindeditor 上传图片java

    - 将接收到的二进制数据保存为图片文件,可能需要对文件名进行处理,避免重复或非法字符。 - 记录上传信息,如文件名、上传时间、文件大小等。 - 返回一个JSON或HTML响应,告知前端上传结果,包括成功或失败信息...

    java写的简单蜘蛛程序

    - POST请求:当需要提交表单数据时,如登录网站,会使用POST请求。 4. **多线程**: - 为了提高爬虫效率,通常会使用多线程并发抓取不同网页,但要注意控制并发量,避免对目标网站造成过大压力。 5. **爬虫策略*...

    经典表单验证.rar

    在IT领域,表单验证是Web开发中的一个关键环节,其主要目的是确保用户提交的数据有效、完整且符合预设的规则,从而维护数据的完整性和准确性。"经典表单验证.rar"这个压缩包文件,根据其标题和描述,很可能是包含了...

    Java EE--注册登录系统

    在本系统中,JSP用于展示注册和登录表单,以及处理表单提交后的结果展示。 4. **MD5加密**:MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,可以将任意长度的数据转化为固定长度的摘要。在用户注册时...

    Java 验证码制作

    同时,表单提交时会携带用户的验证码输入,以便于Servlet进行验证。 总结,Java验证码制作涉及了字符串生成、图像处理以及服务器与客户端的交互等多个环节。通过学习以上步骤,开发者可以更好地理解验证码的实现...

    jsp验证码提交实现

    1. 表单提交:创建一个包含验证码输入框的表单,用户需要输入看到的验证码。 ```html 提交"&gt; ``` 2. 验证码验证:在`SubmitServlet`中,获取用户输入的验证码并与session中的验证码进行比较。 ```java ...

    java汉字验证码

    Java汉字验证码是一种用于验证用户身份的安全机制,常用于防止恶意自动化程序(如机器人)进行非法操作,例如注册、登录或提交表单。在本话题中,我们将深入探讨如何使用Java来实现汉字验证码的生成和验证。 1. **...

    java_jsp_网上投票系统

    - 表单提交:用户选择投票选项后,通过POST请求将数据提交到服务器。 7. **安全性考虑**: - 防止SQL注入:使用预编译语句或参数化查询来避免恶意输入影响数据库。 - 用户验证:可能有登录系统以防止重复投票或...

Global site tag (gtag.js) - Google Analytics