ログ出力インターセプターの実装
ログをDB(PostgreSQL)に出力する実装をした。
今までインターセプターを使わずに
@Execute(validator = false) public String index() { try { // 絵文字の設定をする。 init(request, context); // アクセスカウンターにアクセスする counter = tNumService.getAccessCounter(); // 管理者リンクの表示有無 visibleadmin = Utils.isAdmin(request); // ログ出力 tlogService.insertLog(request); return pageIndex; } catch(Exception e) { // 例外処理 procException(request, e); return "/error.jsp"; } }
という風に
// ログ出力
tlogService.insertLog(request);
を各アクションに入れて対応していました。
理由は、Interceptorの導入方法がわからないから(公式ページを見てもわからなかった)
ネットで調べてみていろいろ試行錯誤して、aop.diconを作ってみたり、app.diconを変更してみたりしたけれども、結局diconファイルを一切弄わないでいいようでした^^;
まずInterceptorしたい関数に以下のようにアノテーションを追加する。
@Execute(validator = false) @Aspect("loggerInterceptor") public String index() {
そしてinterceprtorパッケージに以下のようなクラスを作成する
public class LoggerInterceptor extends AbstractInterceptor { private static final long serialVersionUID = 1L; public HttpServletRequest request; public JdbcManager jdbcManager; public Object invoke(final MethodInvocation invocation) throws Throwable { // 対象のクラス String actonName = getTargetClass(invocation).getName().replaceAll("\\.", "/"); // 対象のメソッド String methodName = invocation.getMethod().getName(); TLog log = new TLog(); log.crtdt = new Timestamp(System.currentTimeMillis()); log.action = actonName +"/" + methodName; log.useragent = Utils.getAllHeader(request); log.body = Utils.getAllParameter(request); System.out.println(log.useragent); System.out.println(log.body); jdbcManager.insert(log).execute(); return invocation.proceed(); } }
とするだけで、インターセプトしてくれました^^
requestにはインターセプト前のものが入っていました。
これでちょっとシンプルになった。後は例外時のインターセプトだ!