下载
 Oracle JDeveloper
 
   标签
adf, java, 全部
 
产品徽标 从设计到实践全面了解 Oracle ADF 应用程序

作者:Chris Muir ACE 总监 和 Penny Cookson ACE

第 5 章 —“暂不具备”需求(但是我们仍然要实现这些需求):防止恶意访问

2009 年 5 月发表

 单击此处查看“从设计到实践全面了解 Oracle ADF 应用程序”描述和目录。

在本章中,我们将添加一些功能以防止恶意访问,具体做法是,阻塞已在最近一小时内连续进行三次查询但未找到任何结果的 IP 地址。我们可以在用户点击 Enquiry 按钮时进行检查,如果用户失败次数过多可以拒绝查询,但在其失败三次后立即隐藏该按钮以使其无法继续操作则更为简洁。我们已经在第 3 章的操作中获取了用户的 IP 地址。

按照类似于前几个阶段的方式,我们需要将这些要求分解为独立的可解决单元,包括:

  1. 创建一个视图对象以使我们可以访问前一小时的查询结果。
  2. 修改页面绑定以使我们可以访问 IP 检查信息。
  3. 识别从其执行 IP 地址检查的事件。
  4. 修改页面组件以在检查失败时禁用 Enquiry 按钮。

创建一个视图对象以使我们可以访问前一小时的查询结果。

我们创建一个名为 IpCheckView 的视图对象。该视图对象将通过 SQL 查询进行只读访问。无需返回有意义的值,因为我们只想知道返回的行数,因此,我们仅选择了一个文字“x”。该视图将具有一个单独的绑定参数 pUserIp,我们使用该参数传入用户的 IP 地址。

图 1

我们将需要在 Application Module 中使视图对象可用。

图 2

修改页面绑定以使我们可以访问 IP 检查信息。

由于我们将需要引用页面上的 IP 地址,因此我们需要更改 EnquiryBean 类。我们可以添加以下代码:

  String userIPAddr;

  public String getuserIPAddr() {
     return userIPAddr;
  }

  public void setuserIPAddr(String userIPAddr) {
      this.userIPAddr = userIPAddr;
  }
然后,更改 storeUserInformation 方法,如下所示:
public void storeUserInformation() {
       
                               setuserIPAddr(getRemoteAddr());
      String userTermsAndConditions = getTermsAndConditions();
      String userEnquirySource = getEnquirySourceCode();
      
      DCDataControl dc = BindingContext.getCurrent().getDefaultDataControl();
      ApplicationModule am = (ApplicationModule)dc.getDataProvider();
      AppModuleImpl service = (AppModuleImpl)am;
      
      service.logSession(userIPAddr, userTermsAndConditions, userEnquirySource);
    }
                            
注意仅第 2 行发生变化。

现在,我们需要修改 SearchPage 的绑定,为 IpCheckView 添加一个迭代器。

图 3

为从新的 IpCheckView1Iterator 迭代器中获取记录,我们将需要针对 ExecuteWithParams 操作创建一个操作绑定。

图 4

在 Create Action 对话框中,我们从下拉列表中选择迭代器 IpCheckView1Iterator,并在 Operation 中选择 ExecuteWithParams。

链接绑定参数 pUserIp 和我们为页面用户确定的 IP 地址最简单的方法是使用 Expression Builder。

图 5

使用 Expression Builder 将绑定参数的值设置为 #{enquiryBean.userIPAddr}。现在,我们的页面已经可以使用 IpCheckView 中的记录和查询操作,我们的绑定将如下所示。

图 6

注意 ExecuteWith Params1 已绑定到 IpCheckViewIterator。我们将使用该操作从 IpCheckView 视图对象中获取记录数。

图 7

识别从其执行 IP 地址检查的事件。

我们需要在每次查询后检查当前 IP 地址查询失败次数,因此我们将从 Enquiry 按钮上的操作调用 ExecuteWith Params1。

图 8

我们还希望在用户第一次接受条款和条件时检查查询失败次数,以防用户关闭之前会话并重新开启一个新的会话(但是通过同一 IP 地址访问该页面)。我们还可以在 Accept 按钮的操作中添加一个调用以调用 ExecuteWith Params1 操作。

修改页面组件以在检查失败时禁用 Enquiry 按钮。

如果用户查询尝试失败次数过多,我们现在可以隐藏 Enquiry 按钮。我们按照如下所示设置 Enquiry 按钮的 Rendered 属性:

图 9

该页面现在处于 Design 模式,如下所示。

图 10

我们现在可以运行该页面并测试 IP 检查。

输入一个无效搜索;我们没有看到结果:

图 11

输入一个无效搜索。

图 12

重复两次无效搜索后,该页面将不允许继续进行查询:

图 13

总结

在本章中,我们添加了代码以防止恶意访问,具体做法是,阻塞已在最近一小时内连续进行三次查询但未找到任何结果的 IP 地址。本系列文章所描述的重要技术之一是直接维护页面绑定,而不是通过在页面中创建组件间接维护。您将发现该方法不仅有助于创建更多的高级功能,更增强了我们对该技术的认识。(关于数据绑定的更多信息,请参见 Oracle Fusion Middleware Fusion Developer's Guide for Oracle Application Development Framework 11g Release 1第 11 节。)

本文至本章已结束!


 单击此处查看“从设计到实践全面了解 Oracle ADF 应用程序”描述和目录。