PlayFrameworkを使っていて、便利だが困ることが一つ。
それは、自動的にサニタイズされてしまうという点。
例えば、
controllers/Application.java
package controllers;
import play.*;
import play.mvc.*;
import views.html.*;
public class Application extends Controller {
public static Result index() {
return ok(main.render("'hoge'"));
}
}
view/main.scala.html
@(autoEscape: String)
<!DOCTYPE html>
<html>
<head>
<title>テスト</title>
</head>
<body>
@autoEscape
</body>
</html>
というコードがあったとすると、実際にmain.scala.htmlに入るautoEscapeには、
「'hoge'」ではなく、「'hoge'」が入ってしまいます。
もちろん、<html>タグの中なら勝手に判断してくれるので、別に問題はないのですが、
例えばview/main.scala.htmlの中に<script>タグを置き、その中に@autoEscapeを
持ってきて処理したい場合は、ちょっと困る。
なぜなら、<script>タグの中では上手い具合に判断してくれないから。
このような事態の回避方法を調べても、ほとんどのサイトで出てくるのは、
「.raw()を使え」という言葉ばかり。
特に、引数で持ってきた値をエスケープさせないで使う方法が書いてない!!!
ということで、辿り着いたページがココ↓
Stack Overflow - How to pass raw html to Play framework view?
そして試してみたのが以下の書き方。
@(notEscape: String)
<!DOCTYPE html>
<html>
<head>
<title>テスト</title>
</head>
<body>
@Html(notEscape)
</body>
</html>
このように、 @html(引数名) と書くことで、「'hoge'」という記載で通ってくれるよ!
やったね!
と思ったら、ちゃんと以前紹介したサイトにも書いてありましたorz
ちゃんと読もう、自分。
@IT - Java開発者がScalaでPlay frameworkのビューを作るには (2/3)
0 件のコメント:
コメントを投稿