在JSTL / JSP中何时我必须使用<c:out value =“$ {myVar}”>我什么时候可以说$ {myVar} </c:out>

时间:2011-07-04 18:09:01

标签: java jsp jstl el

我在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>?还是有些地方我可能还需要它?

2 个答案:

答案 0 :(得分:25)

<c:out>不仅仅是输出文字。它逃脱了HTML特殊字符。每当您不完全确定文本不包含任何这些字符时,请使用它(or ${fn:escapeXml()}):", ', <, >, &。否则,您将拥有无效的HTML(在最好的情况下),页面损坏或跨站点脚本攻击(在最坏的情况下)。

我会给你一个简单的例子让你理解。如果您开发了论坛,并且有人发布了以下消息,并且您没有使用<c:out>来显示此消息,那么您将遇到问题:

<script>while (true) alert("you're a loser");</script>

答案 1 :(得分:7)

  

也许这是因为我的页面声明如下:

<%@ 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年以来已经出版)保持同步......让自己保持最新状态。因此,当您运行支持Servlet 2.4的容器(例如Tomcat 5.5或更新版本)并使用web.xml声明符合Servlet 2.4 API时,您就可以在模板文本中使用EL。

但是,您不应该使用它来(重新)显示用户控制的输入。因此,不要使用它来(重新)显示(保存)请求标头,请求cookie,请求URL,请求参数,请求主体等。这将为XSS attacks打开门。