dedecms织梦内容管理系统    
首页 | java | C/C++ | PHP | 操作系统 | ajax | 脚本编程 | 安全技术 | 本站下载页 | flex | CRM | 专题 | QQ群 | 测试中心 | 会员中心 | 积分规则
  当前位置:主页>java>文章内容
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);

上一篇:Zend Optimizer for Linux安装   下一篇:JSP实现统计当前在线人数的实例代码
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
用户名: 新注册) 密码: 匿名评论
评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
 §最新评论
  热点文章
·java自学路线图
·JSP入门实例教程
·JUnit单元测试(2)
·JUnit单元测试(1)
·什么是Servlet
·用AJAX+J2EE实现网上会议室系统
·浅谈在Java语言中究竟是传值还是
·Java 5.0 多线程编程实践
·Java的文件 读和写
·构造器内部的多态方法的行为
·JSP常用内置对象使用说明
·对于JAVA基础测试中常见的异常问
  相关文章
·JSP实现统计当前在线人数的实例
·Jsp页面列表组件框架设计
·JavaServer Faces框架使用的设计
·实现jsp页面二级下拉框联动,实时
·JSF 应用程序的生命周期
·Java编程思想面向对象逻辑思维方
·JSF 检验器
·J2EE学习者值得研究的开源项目
·JSF 生命周期、转换、检验和阶段
·struts标签使用举例-logic
·JSF与Struts的异同
·web开发中的缓存问题的研究(一
  相关信息
copy right @ 百家拳软件项目研究室 2007 辽ICP备07011763