Java 为什么把JSP放在WEB-INF中?

Java 为什么把JSP放在WEB-INF中?,java,jsp,Java,Jsp,我注意到一种常见的模式是将JSP页面放在WEB-INF文件夹中(而不是WAR根目录)。有什么区别?为什么会选择这种模式?我认为这不是一种好的设计模式,但我相信我可以解释其中的原因 Servlet容器不会提供WEB-INF中的任何内容。通过将JSP放在那里,您可以通过在浏览器中按名称导航到JSP来阻止任何人直接访问JSP。如果您的一些JSP只是代码/标记的片段,不打算直接使用,并且可能会打开一些您没有想到的安全漏洞,那么这可能被认为是一种良好的做法 即使用户看不到WEB-INF中的文件,仍然可以让

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

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

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


即使用户看不到
WEB-INF
中的文件,仍然可以让容器按预期查看和使用JSP。那样比较安全


如果(一个人为的例子)您包含了
db.jsp
,但它本身抛出了一个异常,那么恶意用户可以打开
http://yoursite.com/db.jsp
并从异常消息中了解您的应用程序(最差-数据库凭据)。

使用
控制器(或前端Servlet)时的额外优势就是将URL路径与项目中JSP文件的物理位置解耦

这里的示例是来自
控制器的简单请求映射:

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

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

如果这不是一个好的设计模式,有什么替代方案可以解决您解释的问题?我不同意。我认为这是一个非常好的模式,因为它以一种简单、健壮且易于理解的方式解决了一个实际问题。我同意@pap。1)它强制您在jsp(Servlet、Action等)前面放置一个控制器;2)它确实隐藏了Java细节(.jsp ending)。这根本不是一种设计模式。将jsp文件放在WEB INFis下是一种很好的、官方推荐的设计模式,因为它强制了MVC方法。您仍然可以在非常简单的应用程序中使用“公共”JSP文件。。。当您打开JSP的URL而不是JSP代码时,您不会得到一个HTML响应吗?我可能遗漏了什么