我对JSP技术的理解是,服务器必须将JSP转换为servlet,并在第一次请求JSP时对其进行编译。我正在处理的服务器(IBM Websphere)在部署期间可以选择“预编译JSP页面”。默认情况下,此选项已禁用。
由于这个JSP编译无论如何都必须在某个时刻执行,因此在部署时这样做似乎无可争议地更好,因为它不会影响用户交互(由于页面加载时间较长)。当然,只有第一个用户访问该页面时才会进行此编译,但仍然......
有什么理由我不应该在Websphere(或任何Java服务器)上预编译JSP?为什么默认情况下会被禁用?
答案 0 :(得分:3)
我不确定这一点。到目前为止,我不是JBOSS的大师,但我认为如果你考虑到这个的原因,那可能是一个权衡问题。我想如果你预先编译你的页面,那么这个过程需要一些时间。如果您只是在点击它们时编译页面,那么随着时间的推移,这将会传播,因为每个页面只有在被调用时才会被编译。
不同之处在于,并非所有页面都需要在一个场景中进行编译,以便应用程序更快地旋转,但必须先编译所需的页面,然后才能生成响应。
这可能会产生最大差异的地方在于开发,因为如果按需编译,您只编译实际要打的页面。通过这种方式,您的应用程序可以更快地编译,您可以更快地部署您的complie调试重构周期。
在现实世界中,对于生产部署,您可能总是希望预编译所有jsp文件。
答案 1 :(得分:0)
我提前预编译所有JSP页面的原因是捕获任何编译错误。通常,您的IDE会告诉您页面中的错误,但是包含大量片段的大型项目可能会混淆或减慢IDE的速度,从而导致您关闭JSP验证。
我希望编译时间稍微增加,只是为了得到错误检查。如果您喜欢使用Maven,我建议使用jspc-maven-plugin
或jspc
任务。
答案 2 :(得分:0)
由于这种情况已经持续了三年,没有人提及安全性,所以请允许我提及安全性。
预编译您的JSP,将类文件放入JAR中,对所有JAR进行签名,并制定安全策略以强制执行应用程序逻辑的代码签名。
按需编译JSP的Web服务器容易受到代码注入攻击。如果攻击者可以将JSP加载到服务器上,则服务器将对其进行编译并将其逻辑添加到应用程序中。预编译JSP并在生产服务器上禁用按需编译会阻止某人执行此操作。它还允许您拥有稍微更安全的服务器,因为该服务器不需要编译Java,只需运行它即可。您没有在服务器上放置开发工具。
现在,在有人进入并说:“嘿,如果您可以在目标服务器上放置JSP,是什么阻止您在其中放置恶意编译的代码?”让我解决这个问题。
使用JSP作为攻击媒介的一个好处是,通常存在一种直接的方法来触发JSP中任何逻辑的执行。也可以将代码添加到现有的JSP中,以便将其用作执行挂钩。使用JAR中的代码很难(但并非不可能)。
使恶意的JAR 不可能执行的原因是JAR签名。如果将JVM配置为仅运行已签名的JAR(就应用程序代码而言),则上载的类和JAR文件将不会在JVM期间执行。
解决安全性的最佳时间是在部署应用程序之前,而不是在泄漏了1.43亿人的个人数据之后。只是说'。
*至少从2003年以来,我一直在指出这一点,到目前为止,实际上还没有人听从这一建议。我还在把它放在那里**。
**自2011年以来,我的应用程序都没有使用过JSP,因此对我来说这已经有一段时间了。