【问题标题】:Why put JSP in WEB-INF?为什么要把 JSP 放在 WEB-INF 中?
【发布时间】:2011-10-13 03:28:54
【问题描述】:

我注意到一个常见的模式是将 JSP 页面放在 WEB-INF 文件夹中(而不是 WAR 根目录)。有什么不同?为什么首选?

【问题讨论】:

    标签: java jsp


    【解决方案1】:

    WEB-INF 中的文件对用户不可见。这样比较安全。

    如果(一个人为的示例)您包含db.jsp,但它本身会引发异常,恶意用户可以打开http://yoursite.com/db.jsp 并从异常消息中了解您的应用程序(最糟糕的是数据库凭据) .

    【讨论】:

    • 我不明白...当您打开 JSP 的 URL 而不是 JSP 代码时,您不会只得到一个 HTML 响应吗?我可能遗漏了什么
    【解决方案2】:

    我不认为这是一个好的设计模式,但我相信我可以解释其中的原因。

    Servlet 容器不会提供 WEB-INF 中的任何内容。通过将 JSP 放在那里,您可以防止任何人通过在浏览器中按名称导航到 JSP 来直接访问它。如果您的一些 JSP 只是代码/标记的片段,并不打算直接使用,这可能被认为是一种好的做法,并且可能会打开一些您从未想过的安全漏洞。

    即使在WEB-INF 中,仍然可以让容器按预期查看和使用 JSP。

    【讨论】:

    • 如果它不是一个好的设计模式,你解释的问题的替代解决方案是什么?
    • 我不同意。我认为这是一个非常好的模式,因为它以简单、健壮且易于理解的方式解决了实际问题。
    • 我同意@pap。 1)它强制你在 JSP(Servlet、Action 等)前面放置一个控制器,2)它确实隐藏了 Java 细节(.jsp 结尾)。
    • 这根本不是设计模式。
    • 将 JSP 文件放在 WEB-INFi 下是一种很好的官方推荐的设计模式,因为它强制执行 MVC 方法。您仍然可以在非常简单的应用程序中使用“公共”JSP 文件。
    【解决方案3】:

    使用Controller(或 Front-Servlet)的一个额外好处是,您可以将 URL 路径与项目中 JSP 文件的物理位置分离。

    作为示例,这里是来自 Spring Controller 的简单请求映射:

    @RequestMapping(value = "/item/edit", method = RequestMethod.GET)
    public String getItemEdit(@RequestParam(value = "id", required = false) final String id) {
        return "itemeditform";
    }
    

    ViewResolver 负责将 URL 映射到 JSP 所在的位置。

    【讨论】:

      猜你喜欢
      • 2012-01-05
      • 2014-11-12
      • 2010-12-24
      • 1970-01-01
      • 2012-01-29
      • 1970-01-01
      • 1970-01-01
      • 2013-11-24
      • 1970-01-01
      相关资源
      最近更新 更多