春ブーツの高度なチュートリアルシリーズへのエントリーから - 統合された構成Freemarkerの


ステップ1.私たちは、最初のチュートリアルを参照して、Freemarkerの基本的な構成のapplication.propertiesを設定することができ、[高度なチュートリアルシリーズへのエントリーから春ブーツ - 外部のコンフィギュレーションデータのTomcatのマルチモード、暗号化と復号化を開始]

コアの設定

################################################## ######
### FreeMarkerの
######################################## ################
spring.freemarker.allow要求オーバーライド=偽
spring.freemarker.cache =真
spring.freemarker.check-テンプレート位置=真
spring.freemarker.charset = UTF-8
spring.freemarker.content型= text / htmlの
spring.freemarker.expose-リクエスト属性=偽
spring.freemarker.expose-セッション属性=偽
spring.freemarker.exposeスプリング・マクロヘルパー=偽
spring.freemarker.suffix = .ftl
spring.freemarker.templateローダパス= / WEB-INF / FTL /


ステップ2.当社の決意の役割の権限のラベルの実装クラスを準備し、我々はテンプレートページFreemarkerのを使用します

ユーザーがUSER1のuser2の役割、対応する表示HTMLコンテンツを持っている場合に予想される、または通り

<@hasRole役割= "USER1、USER2">
<a href="#">我拥有USER1或者USER2角色权限</a>の
</ @ hasRoleも>
@Component
パブリッククラスHasRoleTag TemplateDirectiveModelは{実装

公共ボイドを実行(環境ENV、マップparamsは、TemplateModel [] loopVars、TemplateDirectiveBody directiveBody)は
TemplateExceptionは、IOException {スロー
オブジェクト役割= params.get( "役割")。
(StringUtils.isEmpty(役割))なら、{
( "参数[役割]不能为空"、NULL)新しいTemplateExceptionを投げます。
}
IF(hasRoleも(役割)){
directiveBody.render(env.getOut())。
}他{
。env.getOutは()( "")を書き込みます。






(文字列checkRole:ロール)のために{
// TODOここでユーザは、trueを返し、そのような存在として、対応するセッションcheckRoleが存在するか否かを判定する
}
偽に戻ります;
}

}

XSS攻撃の防止を図る必要があるのはなぜステップ3.?我々のデータは、多くの場合、XSSのスクリプトライブラリを存在し、時間のデータが含まれているXSSのスクリプトは、このようなユーザセッションを盗むなど、一部の悪質なページへの影響、される表示する一般的な背景の管理者やユーザーにつながりますクッキーのセッションIDや悪意のある攻撃の結果ページ、または無制限のポップを許可し、さらに深刻には、ユーザデータのセキュリティとユーザー体験のための大きな挑戦であるフィッシングサイトにあなたを導くています。

XSSは、ページJSスクリプトの効果によって主に行われているので、私たちはスクリプティング攻撃の90%まで防ぐことができ、我々が表示するために必要なデータを、エスケープする最も一般的な方法を使用します

次の例

<?#escape xとXのhtml>
これは、データベースの内容を読んでからの読み出しである:?私は今日、コンテンツを見出しています、私はあなたがそれを食べる尋ねる
<SCRIPT>警告(「私はXSSスクリプトだ」); </ SCRIPT>
< /#エスケープ>

次のように私たちは独立性を表示するために必要なすべてのデータがあまりにも多くの冗長なコードを記述する必要がある場合でも、ページの多くの部分で、この時間は、我々は世界的な交換を検討することができ、コードがあります

パブリッククラスHtmlTemplateLoaderがTemplateLoader {実装

プライベート静的最終的な文字列HTML_ESCAPE_PREFIX = "<?#escape xとX HTML>"。
プライベート静的最後の文字列HTML_ESCAPE_SUFFIX = "</#エスケープ>";

民間最終TemplateLoaderデリゲート。

公共HtmlTemplateLoader(TemplateLoaderデリゲート){
this.delegate =デリゲート。
}

@Override
パブリックオブジェクトfindTemplateSource(文字列名)IOExceptionが{スロー
delegate.findTemplateSource(名前)を返します。
}

@Override
公共長いgetLastModified(オブジェクトtemplateSource){
delegate.getLastModified(templateSource)を返します。
}

@Override
公共リーダーgetReaderは(templateSource、文字列エンコーディングオブジェクト)にIOException {スロー
リーダーリーダー= delegate.getReader(templateSource、エンコーディング)。
ストリングtemplateText = IOUtils.toString(リーダー)。
新しいにStringReaderを返す(HTML_ESCAPE_PREFIX + templateText + HTML_ESCAPE_SUFFIX)。
//は新しいにStringReader(templateText)を返します。
}

@Override
公共ボイドcloseTemplateSource(templateSourceオブジェクト)にIOException {スロー
delegate.closeTemplateSource(templateSource)を、
}

}


ステップ4:私たちは、初期Freemarkerの構成と書かれた私たちの上記注入機能コードの使用を開始します

@Configuration
パブリッククラスFreeMarkerConfig {

@Autowired(偽=必須)
プライベートfreemarker.template.Configuration構成。
@Autowired(必須= false)を
民間HasRoleTag hasRoleTag。


@PostConstruct
ます。public void setSharedVariableを(){
//数据转义
configuration.setTemplateLoader(新しいHtmlTemplateLoader(configuration.getTemplateLoader()));
//基本设置
configuration.setNumberFormat( "#####。");
configuration.setDateFormat( "YYYY-MM-DD");
configuration.setDateTimeFormat( "YYYY-MM-DD HH:MM:SS");
configuration.setLocale(新しいロケール( "zh_CNに"));
configuration.setSharedVariable( "hasRoleも"、hasRoleTag)。
}

}

概要、グローバル変数はエスケープタグを使用して、ページ我々はもはや{model.content!「」}出力データをすることができますが、一部の人々は、私たちは、リッチ・テキスト・データを使用することを求めることができる共通$に追加のコードを記述する必要がありますそれを行う方法を、私たちは別のフォローアップ安全ハンドルを一のリッチテキストを説明します、このような状況をデータノードの1つを免れることはできません


---------------------

おすすめ

転載: www.cnblogs.com/liyanyan665/p/11257599.html