我在JSP代码中一直在做这件事:
<c:out value="${myVar}"/>
今天我第一次意识到我似乎也可以使用这个较短的版本:
${myVar}
它在没有<c:out>
的情况下工作!
也许这是因为我的页面是这样声明的:
<%@ page language="java" contentType="text/html;
charset=utf-8" pageEncoding="utf-8" isELIgnored="false" %>
所以,我的问题是,我可以用这个较短的版本替换代码中的<c:out>
吗?有什么理由继续使用<c:out>
吗?或者有没有地方我可能还需要它?
<c:out>
不仅仅是输出文本。它转义HTML特殊字符。每当您不能绝对确定文本中不包含以下任何字符时,请使用它(or ${fn:escapeXml()}
(:", ', <, >, &
。否则,您将遇到无效的HTML(在最好的情况下(、损坏的页面或跨站点脚本攻击(在最坏的情况下,(。
我给你举一个简单的例子,让你明白。如果你开发了一个论坛,有人发布了以下消息,而你没有使用<c:out>
来显示此消息,你就会遇到问题:
<script>while (true) alert("you're a loser");</script>
也许这是因为我的页面是这样声明的:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" isELIgnored="false" %>
不真实。只要<%@page pageEncoding="UTF-8" %>
就足够了。剩余部分已经全部默认。
自JSP 2.0以来,模板文本中的EL就得到了支持,它与Servlet 2.4(自2003年以来就已经推出了…请随时了解最新情况(齐头并进。因此,当您运行一个支持Servlet2.4的容器(例如Tomcat5.5或更高版本(,并声明web.xml
符合Servlet2.4neneneba API时,您将能够在模板文本中使用EL。
但是,您不应该使用它来(重新(显示用户控制的输入。因此,不要使用它来(重新(显示(保存的(请求标头、请求cookie、请求URL、请求参数、请求正文等。这将为XSS攻击打开大门。