filter」タグアーカイブ

Spring Bootでのサーブレットフィルタ設定

この記事は【2018年8月14日】と作成から2年以上経っているため、記事の内容が古い可能性があります。最新の情報を合わせてご確認されることを推奨いたします。

引き続きSpring Bootに関する投稿です。今回は、Spring Bootでサーブレットフィルタを設定するにはどうするか?、です。

環境

  • spring-boot-2.0.4.RELEASE
  • spring-boot-starter-web
  • Embedded Tomcat 8.5.32

組み込みのTomcatコンテナで動作させる前提です。

フィルタの登録方法

Spring Bootでは、web.xmlのような設定ファイルは不要で、コントローラやフィルタなどのクラスを実装し、アノテーションやBean定義を行なうだけで、容易にSpring Bootに追加したい機能(今回はフィルタ)を認識させることができます。

さて、Spring Bootでフィルタを登録する方法ですが、1〜3で利用頻度もしくは一般的であろう順(著者感覚)に整理してみました。

1. FilterRegistrationBeanのBean定義

Spring Bootでは、Servlet、Filter、Listenerに対し、それぞれServletRegistrationBeanFilterRegistrationBeanServletListenerRegistrationBeanというInitializerクラスが用意されています。

これらのクラス群は、ServletContextInitializerインタフェースを実装しており、ServletContextの初期化時に呼ばれ、各種コンフィグレーションを行なうようになっています。そして、各種BeanはServletContextInitializerBeansコンテナ(ここではコレクションのデータコンテナを意味する)に登録されており、TomcatStarteronStartupコールバックでコンフィグレーションが実行されます。

MyFilter、MyFilter2クラスは、通常のフィルタ定義と同様で、javax.servlet.Filterインターフェースを実装したクラスとして定義します。

参考 

2. FilterのBean定義

Servlet3.0で@WebFilterでフィルタ定義ができるようになりました。通常Spring Bootで組み込みコンテナを使って起動した場合、この@WebFilter定義は無視されます。しかし、これらのアノテーションを使ったクラス(ライブラリなど)をアプリケーションでもそのまま利用したい場合、@ServletComponentScanをつけると認識してくれるようです。

@ServletComponentScanを付与した場合、ServletComponentHandlerを継承している各種HandlerクラスであるWebFilterHandlerWebListenerHandlerWebServletHandlerで処理されます。@ServletComponentScanには、スキャンのベースとなるパッケージを指定します。@ServletComponentScanの指定がない場合は、アノテーションが指定されたクラスのパッケージからスキャンされます。

フィルタクラスに@WebFilterを指定します。

参考 

3. ServletContextInitializerのBean定義

フィルタ以外にもServletContextの初期化時に何らかの処理をしたい場合には、独自のServletContextInitializerを定義することができます。この場合1と同様、ServletContextInitializerBeansに登録され、コンテナ起動時にスタートアップコールバックが呼ばれます。コールバックの引数で、ServletContextオブジェクトが渡されるので、その中で必要な設定を行なう方法も可能だと思います。

以下は直接Servlet APIを呼んで、InitParameterやFilterを登録する例です。

参考 

参考リンク

WordPress WP_Hookでのアクションとフィルタ登録

この記事は【2016年12月9日】と作成から2年以上経っているため、記事の内容が古い可能性があります。最新の情報を合わせてご確認されることを推奨いたします。

WordPressにはactionやfilterという仕組みがあり、ユーザーにレスポンスを返すまでの流れの中の任意のポイントで事前に登録したコールバック関数を実行することができます。これにより、WordPressの内部処理における制御の流れをコントロールすることができ、テーマやプラグインの中で頻繁に利用されています。

従来のAPIからの変更点

actionやfilterを使う場合は、通常add_actionadd_filterというAPIを使ってコールバック関数を登録しますが、内部構造を理解している人は、以下のようなハックをしているかもしれません。というのは、以前のadd_filter関数の中身が以下のように実装されていたからです。

$wp_filterは、単純なarrayとして実装されていたので上記のような配列アクセスで値を代入できました。しかし、今回はWP_Hookというクラスに置き換わっています(このクラスは、IteratorとArrayAccessを実装しているので配列のような振る舞いをします。https://github.com/WordPress/WordPress/blob/master/wp-includes/class-wp-hook.php)。そして、タグごとにWP_Hookオブジェクトが生成されています。

WP_Hookのメソッドを使う

以上をふまえ、actionやfilterの登録にはadd_actionadd_filterのAPIを使うかまたは以下のような方法でも可能なようです。

add_action、add_filter

冗長になるので素直にadd_actionやadd_filter関数を使った方がいいですね。。

参考リンク

Cloudera Manager + fluentd webhdfsのイベントで報告されるFileNotFoundExceptionを除外する

この記事は【2013年12月14日】と作成から2年以上経っているため、記事の内容が古い可能性があります。最新の情報を合わせてご確認されることを推奨いたします。

Cloudera Manager Standard(以下CM)で環境構築中。 

CMでは,CMの管理画面上で各種サービスの設定を管理できるようになっているが,主要な設定以外の任意の設定を追加したい場合,安全バルブというフックを利用することで可能となっている。fluentd + webhdfsでHDFSへファイルを書き込む場合,2回のHTTPリクエストが発生する。1回目のHTTPリクエストでは,新規ファイル作成の場合は以下のようなFileNotFoundExceptionが表示されるが,これは仕様どおりで実質無害なExceptionなので除外したい。

初め,NameNodeの安全バルブでappenderのRFAにorg.apache.log4j.varia.StringMatchFilterの設定を加えたが,変わらずCM管理画面上のイベントには,FileNotFoundExceptionが報告されてしまう。ということで,どうもEventServerは上記とは別にログイベントを受け取っているようだ。EventServer,NameNodeのlog4j.propertiesを見ると,以下のような定義が見られる。

ということで,RFAとは別にログイベントを転送しているであろうこのappenderにfilter設定を追加すれば上手くいきそうである。properties形式で以下のように安全バルブに設定を加える。

これで今のところイベントにあがってきていないので上手くいったようだ。NameNodeのログもフィルタリングする場合は,RFAにも設定を加える。

参考