質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

Q&A

解決済

1回答

3995閲覧

java filterプログラム追加について

jojo

総合スコア7

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

0グッド

0クリップ

投稿2015/08/10 10:41

こんにちは。
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>

【追加するプログラム】

java

1package util; 2 3import java.io.IOException; 4import java.util.Enumeration; 5 6import javax.servlet.Filter; 7import javax.servlet.FilterChain; 8import javax.servlet.FilterConfig; 9import javax.servlet.ServletException; 10import javax.servlet.ServletRequest; 11import javax.servlet.ServletResponse; 12import javax.servlet.http.HttpServletRequest; 13import javax.servlet.http.HttpSession; 14 15import org.apache.log4j.NDC; 16import org.slf4j.Logger; 17import org.slf4j.LoggerFactory; 18 19 20public final class NdcFilter implements Filter { 21 22 23 private static final Logger logger = LoggerFactory.getLogger(NdcFilter.class); 24 private FilterConfig filterConfig = null; 25 26 public void destroy() { 27 this.filterConfig = null; 28 } 29 30 public void doFilter(ServletRequest request, ServletResponse response, 31 FilterChain chain) throws IOException, ServletException { 32 if (filterConfig == null) { 33 return; 34 } 35 36 if (request instanceof HttpServletRequest) { 37 HttpServletRequest req = (HttpServletRequest) request; 38 39 HttpSession session = req.getSession(); 40 41 //if (session== null) { 42 43 Enumeration e = req.getParameterNames(); 44 45 while(e.hasMoreElements()) { 46 String key = (String)e.nextElement(); 47 48 //logger.debug(key + ":" + req.getParameter(key)); 49 50 if ( (key.equals("loginId")) || (key.equals("U"))){ 51 52 session.setAttribute("loginId_log4j", req.getParameter(key)); 53 logger.debug((String)session.getAttribute("loginId_log4j")); 54 break; 55 } 56 57 } 58 //} 59 NDC.push(req.getSession().getId() + " " + (String)session.getAttribute("loginId_log4j")); 60 61 try { 62 chain.doFilter(request, response); 63 } finally { 64 NDC.remove(); 65 } 66 } 67 } 68 69 public void init(FilterConfig filterConfig) throws ServletException { 70 this.filterConfig = filterConfig; 71 }

「encodingfilter」より後ということはわかっているのですが、そもそもそれぞれのフィルターの意味があまりよくわかっておらず、本番で障害となる恐れもあるので、各フィルターの意味も合わせて知りたいと思っています。

そこで、次の2点について、ご教示いただきたく、よろしくお願いします。
①各fillterについて、どんな役割をもっているか。
②【追加したいfilter-mapping】を追加する位置はどこが適当か。

ご協力よろしくお願いします!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

まず、気にされていましたが、本番で実験すると必ず障害になるので本番を直接修正するのは避けましょう。
実験できる環境を用意しましょう。TomcatやJavaのバージョンがわかっているので、できるだけバージョンをあわせた開発環境を用意しましょう。

1. 各fillterについて、どんな役割をもっているか。

このweb.xmlで使われているfilterは下記の5つです。

  • encodingfilter
  • requestDumpFilter
  • hotdeployfilter
  • s2filter
  • routingfilter

それぞれFilterとして動作するクラスが<filter-class>に書かれています。検索し、簡単にまとめてみました。

RequestDumpFilterやHotDeployFilterは本番環境ではあまり使われないフィルタだと思います。パフォーマンスに著しく問題がある場合は、これらのフィルタを外すことを検討してください。特にRequestDumpFilterはログにリクエスト時のパラメータが出力されるので、セキュリティ要件から見ても問題がある場合があるでしょう。

2. 【追加したいfilter-mapping】を追加する位置はどこが適当か。

これらのFilterをどのURLで有効にするのか、設定するのが<filter-mapping>です。<filter-mapping><filter>の後に設定します。web.xmlに定義した順番でFilterが実行されます。今回のNDCFilterは実行順に依存しないフィルタなので、どこに追加しても大丈夫でしょう。

気になること

NDCFilterですが、リクエストパラメータからloginIdを取り出していますが、loginId等はリクエストパラメータで引き回さず、セッションに格納されていないでしょうか?もしログに出ていないのであれば、その辺りの設計を確認してみてくださし。

投稿2015/08/10 12:55

編集2015/08/11 00:58
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jojo

2015/08/10 23:46

回答ありがとうございます! 1の回答は、まさに知りたかった内容です。ありがとうございました。 2の回答ですが、質問の仕方が悪くて申し訳ありません。 <filter-mapping>で、今回追加する「NDCFilter」について encodingfilter requestDumpFilter hotdeployfilter s2filter routingfilter requestDumpFilter のどの間(もしくは一番最後?)に配置するのが 適当でしょうか、という内容でした。 もし可能でしたら、ご意見いただけると幸いです。
退会済みユーザー

退会済みユーザー

2015/08/11 00:59

2について、回答を追記しました。このFilterは順番に依存しないので、どこに定義してもOKです。
退会済みユーザー

退会済みユーザー

2015/08/11 00:59

もし回答がOKであれば、ベストアンサーに選んでいただけるとうれしいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問