LoginSignup
9
6

More than 5 years have passed since last update.

Springの出力時のHTMLエスケープの仕様と注意点について

Posted at

Springの出力時のHTMLエスケープの仕様について、調査した結果を記載しておきます。なお、バージョン4.1.4での調査結果で、バージョンによって動作は異なる可能性があります。

HTMLエスケープは、以下のレベルで設定できます。1 < 2 < 3 での順で設定が上書きされます。

1. アプリケーションレベル

web.xmlにdefaultHtmlEscapeを定義

web.xml
<context-param> 
<param-name>defaultHtmlEscape</param-name> 
<param-value>true</param-value> 
</context-param> 

2. ページレベル

ページ内にdefaultHtmlEscapeを定義

<spring:htmlEscape defaultHtmlEscape="true" /> 

3. タグレベル

ページの各タグにhtmlEscapeを定義

<spring:message htmlEscape="true" ...> 
<form:input path="name" htmlEscape="true" ...> 

で、ここで注意したいのは、web.xmlのdefaultHtmlEscapeの評価の仕方がタグによって異なっているということです。 spring:messageなどのspringタグの場合は、defaultHtmlEscapeが明示的にtrueに設定してあった場合にのみ、HTMLエスケープします。これに対して、form:inputなどのformタグの場合は、defaultHtmlEscapeが明示的にtrueに設定していなくても、未設定であればHTMLエスケープします。

全てのレベルで設定が無かった場合にのみ両者に違いが出ます。
springタグの場合は、以下の条件で判定し、

(this.defaultHtmlEscape != null && this.defaultHtmlEscape.booleanValue()) 

formタグの場合は、以下の条件で判定します。

(defaultHtmlEscape == null || defaultHtmlEscape.booleanValue()) 

[参考]
詳細に関しては、実際にソースコードを確認してみると分かると思います。

HtmlEscapingAwareTag.java
http://grepcode.com/file/repo1.maven.org/maven2/org.springframework/spring-webmvc/4.1.4.RELEASE/org/springframework/web/servlet/tags/HtmlEscapingAwareTag.java?av=f

AbstractFormTag.java
http://grepcode.com/file/repo1.maven.org/maven2/org.springframework/spring-webmvc/4.1.4.RELEASE/org/springframework/web/servlet/tags/form/AbstractFormTag.java?av=f

RequestContextAwareTag.java
http://grepcode.com/file/repo1.maven.org/maven2/org.springframework/spring-webmvc/4.1.4.RELEASE/org/springframework/web/servlet/tags/RequestContextAwareTag.java?av=f

9
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
6