我是 Java EE 的新手,我知道类似以下三行的内容
<%= x+1 %>
<%= request.getParameter("name") %>
<%! counter++; %>
是一种老派的编码方式,在 JSP 版本 2 中有一种方法可以避免在 JSP 文件中使用 Java 代码。替代的 JSP 2 行是什么,这种技术叫什么?
原文由 chmoelders 发布,翻译遵循 CC BY-SA 4.0 许可协议
我是 Java EE 的新手,我知道类似以下三行的内容
<%= x+1 %>
<%= request.getParameter("name") %>
<%! counter++; %>
是一种老派的编码方式,在 JSP 版本 2 中有一种方法可以避免在 JSP 文件中使用 Java 代码。替代的 JSP 2 行是什么,这种技术叫什么?
原文由 chmoelders 发布,翻译遵循 CC BY-SA 4.0 许可协议
作为保护措施:永久禁用 Scriptlet
正如 另一个问题 正在讨论的那样,您可以并且始终应该在您的 web.xml
Web 应用程序描述符中禁用 scriptlet。
我会一直这样做,以防止任何开发人员添加 scriptlet,尤其是在您迟早会失去概览的大公司中。 web.xml
设置如下所示:
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<scripting-invalid>true</scripting-invalid>
</jsp-property-group>
</jsp-config>
原文由 Stefan Schubert-Peters 发布,翻译遵循 CC BY-SA 3.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
自 taglib (如 JSTL )和 EL ( 表达式语言,那些
${}
东西)早在 2001 年就诞生以来, JSP 中使用 scriptlet (那些<% %>
东西)确实是非常不鼓励的.Scriptlet 的主要缺点是:
Sun Oracle 本身也在 JSP 编码约定 中建议,只要(标记)类可以实现相同的功能,就避免使用 scriptlet 。以下是几个相关的引用:
如何替换 scriptlet 完全取决于代码/逻辑的唯一目的。这段代码通常被放在一个完全有价值的 Java 类中:
doFilter()
方法中相应地编写代码.例如:当映射到一个适当的
<url-pattern>
覆盖感兴趣的JSP页面时,那么你不需要复制粘贴整个JSP页面的同一段代码。doGet()
中相应地编写代码---
方法。例如:这种处理异常的方式更容易。在 JSP 呈现过程中不访问数据库,而是在显示 JSP 之前访问数据库。每当数据库访问抛出异常时,您仍然可以更改响应。在上面的示例中,将显示默认错误 500 页面,您可以通过
<error-page>
中的web.xml
进行自定义。doPost()
方法中。例如:这种处理不同结果页面目标的方式更容易:在出现错误的情况下重新显示带有验证错误的表单(在这个特定示例中,您可以使用
${message}
在 EL 中重新显示它),或者只是选择所需的目标成功时的页面。或者只是采用 MVC 框架,如 JSF 、 Spring MVC 、 Wicket 等,这样您最终只需要一个 JSP/Facelets 页面和一个 JavaBean 类,而无需自定义 servlet。
List<Product>
:使用 XML 样式的标签非常适合所有 HTML,代码比一堆带有各种左大括号和右大括号的 scriptlet 更易读(因此更易于维护)( “这个右大括号到底属于哪里?” )。一个简单的帮助是将您的 Web 应用程序配置为在仍然使用 scriptlet 时抛出异常,方法是将以下内容添加到
web.xml
:在 JSP 的后继者 Facelets 中,它是 Java EE 提供的 MVC 框架 JSF 的一部分,已经 不可能 使用 scriptlet 了。这样你就会自动被迫以“正确的方式”做事。
${}
东西。例如重新显示提交的输入值:${param.foo}
显示request.getParameter("foo")
的结果。public static
方法),那么您需要将它们定义为 EL 函数。 JSTL 中有一个标准的 函数标签库,但 您也可以轻松地自己创建函数。这是一个 JSTLfn:escapeXml
如何用于防止 XSS 攻击 的示例。请注意,XSS 敏感性与 Java/JSP/JSTL/EL/等等没有任何具体关系,在您开发的 每个 Web 应用程序中都需要考虑这个问题。 scriptlet 的问题是它没有提供内置的预防方法,至少没有使用标准的 Java API。 JSP的后继者Facelets已经隐含了HTML转义,所以不用担心Facelets中的XSS漏洞。
也可以看看: