我是否应该预编译JSP页面?有什么理由不这样做吗?

4
我对JSP技术的理解是,服务器必须将JSP翻译成Servlet并在第一次请求时进行编译。我正在使用的服务器(IBM Websphere)在部署期间有一个选项可以“预编译JSP页面”。默认情况下,此选项处于禁用状态。
既然这个JSP编译无论如何都必须执行,因此在部署时执行似乎显然更好,因为它不会影响用户交互(由于较长的页面加载时间)。尽管这个编译只会发生在第一个访问该页面的用户身上,但仍然...。
是否有任何理由不应在Websphere(或任何Java服务器)上预编译JSP?为什么默认情况下它被禁用?

很可能默认情况下被禁用,因为在开发过程中,每次部署以测试小的更改时,预编译每个JSP将需要太多时间。对于生产环境,预编译确实是一个好主意。这也将允许快速失败,如果其中一个JSP无法编译,而不是等待第一个用户进入页面并抱怨。 - JB Nizet
部署需要更长的时间... - brso05
有时候你可以在部署之前进行预编译:http://chaitpress.com/2010/10/28/how-to-pre-complie-jsps-in-weblogic/ - zapl
3个回答

4
自从这个问题持续了三年而没有人提到安全问题,让我来提一下安全问题。
预编译您的JSP,将类文件放入JAR中,签署所有JAR,并制定一个安全策略,要求应用逻辑进行代码签名。
按需编译JSP的Web服务器容易受到代码注入攻击。如果攻击者可以将JSP放在服务器上,则服务器将对其进行编译并将其逻辑添加到应用程序中。在生产服务器上预编译JSP并禁用按需编译可防止此情况发生。这也使您的服务器更加安全,因为服务器不需要编译Java,只需要运行它。您不会将开发工具放在服务器上。
现在,在有人跳出来说:“嘿,如果你能在目标服务器上放置JSP,那么有什么阻止你在那里放置恶意编译代码呢?”之前,让我解决这个问题。
使用JSP作为攻击向量的一个好处是通常有一种简单的方法来触发JSP中任何逻辑的执行。还可以添加代码到现有的JSP中,以将其用作执行钩子。使用JAR中的代码更难,但并非不可能。
使恶意JAR无法执行的方法是JAR签名。如果您的JVM仅配置为运行已签名的JAR(就应用程序代码而言),则上传的类和JAR文件将无法在JVM中执行。
解决安全问题的最佳时间是在部署应用程序之前,而不是在泄漏了1.43亿人的个人数据之后。只是这么说一下。
*我至少从2003年开始指出这个问题,到目前为止,没有人真正听从这个建议。我仍然在提醒大家。
**自2011年以来,我的所有应用程序都没有使用JSP,因此这对我来说已经是一个无关紧要的问题。

3

我对此并不确定。我远非JBOSS大师,但我认为如果你考虑到这个问题的原因,这可能是一个权衡问题。我想,如果您预编译页面,该过程将需要一些时间。而如果您只在访问页面时编译页面,那么这将把工作分散到随着每个页面的调用逐渐进行编译。

区别在于,在某种情况下,并非所有页面都需要编译,以便应用程序更快地启动,但在生成响应之前必须编译您想要的页面。

这种差异可能最大的影响是在开发中,因为如果按需编译,您只需要编译实际访问的页面。这样,您的应用程序编译得更快,部署更快,您的编译调试重构周期也加快了。

在真实世界中,对于生产部署,您可能始终要预编译所有jsp文件。


1
成为 JBoss 大师对此问题并没有太大的帮助,因为这个问题是关于 WebSphere 的 :-) - JB Nizet

0

我预编译所有 JSP 页面的原因是为了捕获任何编译错误。通常,您的 IDE 会告诉您页面中的错误,但包含大量代码片段的大型项目可能会使 IDE 混淆或变慢,导致您关闭 JSP 验证。

我更喜欢稍微增加一点编译时间,只为了进行错误检查。如果您使用 Maven,则建议使用类似于 jspc-maven-plugin 的插件;如果您更喜欢 Ant,则可以使用 jspc 任务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接