java filterプログラム追加について
解決済
回答 1
投稿
- 評価
- クリップ 0
- VIEW 2,602
こんにちは。
javaのプログラム初心者?です。
現在、すでに運用中のシステムのlog4jログに対し、セッションIDと利用者IDを付与するよう要望があり、対応しようとしています。
ネット上には、NDC機能を使ってlogにpushすれば可能、ということでプログラムを用意し、また、web.xml上にfilterを追加しようとしていますが、filter-mappingについてどこに配置するすればよいか分からずに困っているところです。
【環境】
OS:CentOS release 6.5 (Final)
tomcat:6.0.39
apache:2.2.21
java:1.7.0_45
【現在のfilter、filter-mapping(web.xml)】
【追加したいfilter-mapping】
「encodingfilter」より後ということはわかっているのですが、そもそもそれぞれのフィルターの意味があまりよくわかっておらず、本番で障害となる恐れもあるので、各フィルターの意味も合わせて知りたいと思っています。
そこで、次の2点について、ご教示いただきたく、よろしくお願いします。
①各fillterについて、どんな役割をもっているか。
②【追加したいfilter-mapping】を追加する位置はどこが適当か。
ご協力よろしくお願いします!
javaのプログラム初心者?です。
現在、すでに運用中のシステムのlog4jログに対し、セッションIDと利用者IDを付与するよう要望があり、対応しようとしています。
ネット上には、NDC機能を使ってlogにpushすれば可能、ということでプログラムを用意し、また、web.xml上にfilterを追加しようとしていますが、filter-mappingについてどこに配置するすればよいか分からずに困っているところです。
【環境】
OS:CentOS release 6.5 (Final)
tomcat:6.0.39
apache:2.2.21
java:1.7.0_45
【現在のfilter、filter-mapping(web.xml)】
<filter>
<filter-name>encodingfilter</filter-name>
<filter-class>org.seasar.extension.filter.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>Windows-31J</param-value>
</init-param>
</filter>
<filter>
<filter-name>requestDumpFilter</filter-name>
<filter-class>org.seasar.extension.filter.RequestDumpFilter</filter-class>
</filter>
<filter>
<filter-name>hotdeployfilter</filter-name>
<filter-class>org.seasar.framework.container.hotdeploy.HotdeployFilter</filter-class>
</filter>
<filter>
<filter-name>s2filter</filter-name>
<filter-class>org.seasar.framework.container.filter.S2ContainerFilter</filter-class>
</filter>
<filter>
<filter-name>routingfilter</filter-name>
<filter-class>org.seasar.struts.filter.RoutingFilter</filter-class>
<init-param>
<param-name>jspDirectAccess</param-name>
<param-value>false</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingfilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>hotdeployfilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<filter-mapping>
<filter-name>s2filter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<filter-mapping>
<filter-name>NDCfilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>routingfilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
<filter-mapping>
<filter-name>requestDumpFilter</filter-name>
<url-pattern>*.do</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
【追加したいfilter-mapping】
<filter>
<filter-name>NDCfilter</filter-name>
<filter-class>util.NdcFilter</filter-class>
</filter>
<filter>
<filter-name>NDCfilter</filter-name>
<filter-class>util.NdcFilter</filter-class>
</filter>
【追加するプログラム】
package util;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.log4j.NDC;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public final class NdcFilter implements Filter {
private static final Logger logger = LoggerFactory.getLogger(NdcFilter.class);
private FilterConfig filterConfig = null;
public void destroy() {
this.filterConfig = null;
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
if (filterConfig == null) {
return;
}
if (request instanceof HttpServletRequest) {
HttpServletRequest req = (HttpServletRequest) request;
HttpSession session = req.getSession();
//if (session== null) {
Enumeration e = req.getParameterNames();
while(e.hasMoreElements()) {
String key = (String)e.nextElement();
//logger.debug(key + ":" + req.getParameter(key));
if ( (key.equals("loginId")) || (key.equals("U"))){
session.setAttribute("loginId_log4j", req.getParameter(key));
logger.debug((String)session.getAttribute("loginId_log4j"));
break;
}
}
//}
NDC.push(req.getSession().getId() + " " + (String)session.getAttribute("loginId_log4j"));
try {
chain.doFilter(request, response);
} finally {
NDC.remove();
}
}
}
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
}
「encodingfilter」より後ということはわかっているのですが、そもそもそれぞれのフィルターの意味があまりよくわかっておらず、本番で障害となる恐れもあるので、各フィルターの意味も合わせて知りたいと思っています。
そこで、次の2点について、ご教示いただきたく、よろしくお願いします。
①各fillterについて、どんな役割をもっているか。
②【追加したいfilter-mapping】を追加する位置はどこが適当か。
ご協力よろしくお願いします!
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+2
まず、気にされていましたが、本番で実験すると必ず障害になるので本番を直接修正するのは避けましょう。
実験できる環境を用意しましょう。TomcatやJavaのバージョンがわかっているので、できるだけバージョンをあわせた開発環境を用意しましょう。
このweb.xmlで使われているfilterは下記の5つです。
それぞれFilterとして動作するクラスが<filter-class>に書かれています。検索し、簡単にまとめてみました。
- encodingfilter : リクエストのエンコーディングを設定するためのフィルタ
- requestDumpFilter : HttpServletRequestの内容をサーブレットが処理する前後にダンプ出力するフィルタ
- hotdeployfilter : HotDeploy用のフィルタです。HotDeployとは開発中、クラスを書き換えるとそのままWebアプリケーションに反映する機能がSeasar2にはあるのですが、このFilterはHotDeployを有効にします
- s2filter : s2container用のフィルタです。S2Containerの初期化等を行います。
- routingfilter: リクエストされたURLを適切なアクションに振り分けるフィルタ
RequestDumpFilterやHotDeployFilterは本番環境ではあまり使われないフィルタだと思います。パフォーマンスに著しく問題がある場合は、これらのフィルタを外すことを検討してください。特にRequestDumpFilterはログにリクエスト時のパラメータが出力されるので、セキュリティ要件から見ても問題がある場合があるでしょう。
これらのFilterをどのURLで有効にするのか、設定するのが<filter-mapping>です。<filter-mapping>は<filter>の後に設定します。web.xmlに定義した順番でFilterが実行されます。今回のNDCFilterは実行順に依存しないフィルタなので、どこに追加しても大丈夫でしょう。
NDCFilterですが、リクエストパラメータからloginIdを取り出していますが、loginId等はリクエストパラメータで引き回さず、セッションに格納されていないでしょうか?もしログに出ていないのであれば、その辺りの設計を確認してみてくださし。
実験できる環境を用意しましょう。TomcatやJavaのバージョンがわかっているので、できるだけバージョンをあわせた開発環境を用意しましょう。
1. 各fillterについて、どんな役割をもっているか。
このweb.xmlで使われているfilterは下記の5つです。
- encodingfilter
- requestDumpFilter
- hotdeployfilter
- s2filter
- routingfilter
それぞれFilterとして動作するクラスが<filter-class>に書かれています。検索し、簡単にまとめてみました。
- encodingfilter : リクエストのエンコーディングを設定するためのフィルタ
- requestDumpFilter : HttpServletRequestの内容をサーブレットが処理する前後にダンプ出力するフィルタ
- hotdeployfilter : HotDeploy用のフィルタです。HotDeployとは開発中、クラスを書き換えるとそのままWebアプリケーションに反映する機能がSeasar2にはあるのですが、このFilterはHotDeployを有効にします
- s2filter : s2container用のフィルタです。S2Containerの初期化等を行います。
- routingfilter: リクエストされたURLを適切なアクションに振り分けるフィルタ
RequestDumpFilterやHotDeployFilterは本番環境ではあまり使われないフィルタだと思います。パフォーマンスに著しく問題がある場合は、これらのフィルタを外すことを検討してください。特にRequestDumpFilterはログにリクエスト時のパラメータが出力されるので、セキュリティ要件から見ても問題がある場合があるでしょう。
2. 【追加したいfilter-mapping】を追加する位置はどこが適当か。
これらのFilterをどのURLで有効にするのか、設定するのが<filter-mapping>です。<filter-mapping>は<filter>の後に設定します。web.xmlに定義した順番でFilterが実行されます。今回のNDCFilterは実行順に依存しないフィルタなので、どこに追加しても大丈夫でしょう。
気になること
NDCFilterですが、リクエストパラメータからloginIdを取り出していますが、loginId等はリクエストパラメータで引き回さず、セッションに格納されていないでしょうか?もしログに出ていないのであれば、その辺りの設計を確認してみてくださし。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.13%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2015/08/11 08:46
1の回答は、まさに知りたかった内容です。ありがとうございました。
2の回答ですが、質問の仕方が悪くて申し訳ありません。
<filter-mapping>で、今回追加する「NDCFilter」について
encodingfilter
requestDumpFilter
hotdeployfilter
s2filter
routingfilter
requestDumpFilter
のどの間(もしくは一番最後?)に配置するのが
適当でしょうか、という内容でした。
もし可能でしたら、ご意見いただけると幸いです。
2015/08/11 09:59
2015/08/11 09:59