今、リクエストを受信した後に対外接続を行うシステムを作ってますが、がつがつと外部に繋ぐのも気が引けるという事で、、そのシミュレータとして簡単なWebAPも作りました。
APサーバは、WebLogic11G。作っているAPの仕様上、POSTをサーブレット処理してます。
で、結局Oracleのページに乗っていたグッドなサンプルをそのままパクってみました(汗)
Oracle Containers for J2EE サーブレット開発者ガイド
Request処理は解るのですが、Responseの方はFilter内でラップするというちょっと自分では考え付かない内容でした。。
上記に載っている、FilterServletOutputStreamとGenericResponseWrapperは、深く考えずに同一パッケージ内にそのままクラスとして作ります。
で、Filterクラスを作ってログを出力します。よく使っているlog4j2でやってます。
package jp.esoro.http;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.OutputStream;
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.HttpServletResponse;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class PostFilter implements Filter {
protected static Logger logger = LogManager.getLogger();
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
try {
//要求
HttpServletRequest req = (HttpServletRequest) request;
BufferedReader body = new BufferedReader(req.getReader());
String ret = body.readLine();
//要求ロギング
logger.info(req.getRemoteAddr()+"->"+req.getLocalAddr()+":"+req.getLocalPort()+req.getContextPath() + ":" + req.getMethod() + " RCV:"+ret);
OutputStream out = response.getOutputStream();
GenericResponseWrapper wrapper =
new GenericResponseWrapper((HttpServletResponse) response);
//この後、サーブレット側処理に移ります
chain.doFilter(request, wrapper);
//ラップしたwrapperからサーブレットの処理結果を取得
byte[] data = wrapper.getData();
//OutputStreamに書き込んで応答
out.write(data);
out.close();
//Shift-JISでString変換
String result = new String(data, "Shift-JIS");
//応答ロギング
logger.info(req.getRemoteAddr()+"<-"+req.getLocalAddr()+ ":"+req.getLocalPort()+ req.getContextPath() + ":" + req.getMethod() + " SND:"+result);
} catch (IOException e) {
logger.error(e.getMessage());
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}
で、web.xmlに上記Filterをセットします
<!-- Filter -->
<filter>
<filter-name>PostFilter</filter-name>
<filter-class>jp.esoro.http.PostFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>PostFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
最初サーブレットはアノテーション@WebServletで書きましたが、どうも11Gだとダメっぽいのでweb.xmlにservletをMappingする事にしました。シミュレータは本当に簡単なAPなので。。
開発環境は他のプロジェクトで使うWebLogic12cのままで11Gを別途用意しなかったんですが、実行環境が違うとデプロイに失敗して結構メンドクサイです。コンパイラーJavaのバージョンをちゃんと確認してなかったからなんですけど、、