【问题标题】:HTTPServletRequest object - Encapsulation - Best practiceHTTPServletRequest 对象 - 封装 - 最佳实践
【发布时间】:2018-07-28 16:25:36
【问题描述】:

在构建 java web 应用程序时,有时我们会为模型类使用 Form 类,以“...保存将 ServletRequest 传递给其他组件,例如验证器。ServletRequest 是特定于 servlet 的类型,不应该暴露给应用程序的其他层。" 表单类与模型类是相同的类,但不可序列化。

引用来自 Servlets & JSP 和 Spring MVC 教程。我试图理解第二个语句,即 ServletRequest 对象已公开。出于安全原因,这是最佳做法吗?如果有人可以解释,那就太好了。显然,实现这一点需要大量代码,对于初学者来说,这似乎是多余的。

非常感谢, A.

【问题讨论】:

    标签: java servlets


    【解决方案1】:

    ServletRequest 是特定于 servlet 的类型,不应暴露给应用程序的其他层。

    如果您的服务、数据访问对象等都绑定到 ServletRequest 类(例如,它们都以 ServletRequest 作为参数),那么您有两个主要缺点:

    • 该代码只能在 servlet 上下文中使用:您不能在控制台应用程序中使用它们,或者在不基于 servlet 规范的 Web 应用程序中使用它们,或者当操作由 HTTP 请求以外的东西触发时(例如例如,来自队列的消息)
    • 代码更难阅读、理解和测试

    让我们举一个简单的例子。这两个版本的方法之间最容易理解的是什么:

    class TransferForm {
      String fromAccountId;
      String toAccountId;
      BigDecimal amount;
    
      // constructor, methods omitted for brevity
    }
    
    void transferMoney(TransferForm form);
    

    void transferMoney(HttpServletRequest request)
    

    知道必须将什么作为参数传递给这两种方法有多容易?

    在第一种情况下,非常清楚。

    在第二种情况下:请求中的金额在哪里?是参数吗?一个属性?它是如何命名的?它应该有什么类型?如何在测试中创建和填充 HttpServletRequest 实例?

    【讨论】:

    • 我明白了。谢谢。
    猜你喜欢
    • 2020-04-04
    • 1970-01-01
    • 2011-07-12
    • 2011-12-27
    • 2023-04-01
    • 1970-01-01
    • 2012-02-19
    • 2015-01-13
    • 2014-06-16
    相关资源
    最近更新 更多