Controller共通処理
コントローラ共通処理を書きたくなったので、調べてみました。
今回はログ出力の記事になりますが、応用すればログイン管理なども簡単にできそうです。
・postHandle()でもmodelAndViewの内容をデバッグ出力してもいいですね
・コントローラ呼び出し結果
今回はログ出力の記事になりますが、応用すればログイン管理なども簡単にできそうです。
[広告]
[広告]
Interceptorを作成
・sample.app.common.ControllerInterceptor.groovyを作成package sample.app.common import org.springframework.http.HttpMethod import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletResponse import org.slf4j.Logger import org.slf4j.LoggerFactory import org.springframework.context.annotation.Bean import org.springframework.stereotype.Component import org.springframework.web.servlet.HandlerInterceptor import org.springframework.web.servlet.ModelAndView import org.springframework.web.servlet.handler.MappedInterceptor /** * コントローラの呼び出し前後で実行するInterceptor */ @Component class ControllerInterceptor implements HandlerInterceptor { private static final Logger log = LoggerFactory.getLogger(this) // ログ出力対象のhttpメソッド private static final List・性能に影響が出ないようにlog.isInfoEnabled()でログ出力判定を行っていますLOGGING_METHOD = [ HttpMethod.GET.toString(), HttpMethod.POST.toString(), HttpMethod.PUT.toString(), HttpMethod.DELETE.toString() ] // 除外するパターン private static final String[] EXCLUDE_PATTERNS = ["/**/*.js", "/**/*.html", "/**/*.css", "/**/*.ico"] /** * 静的なリクエストは除外する * @return MappedInterceptor */ @Bean MappedInterceptor interceptor() { return new MappedInterceptor(null, EXCLUDE_PATTERNS, new ControllerInterceptor()) } /** * Controllerの呼び出し前に呼び出す */ @Override boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (log.isInfoEnabled() && request != null) { String requestUri = request.requestURI // 呼び出しコントローラのログ出力 if (LOGGING_METHOD.contains(request.method)) { String message = "Request uri: ${request.method} ${requestUri}" if (request.queryString != null) { message += "?${request.queryString}" } log.info(message) } } // 返り値がTrueでないとControllerが呼び出さない return true } /** * Controllerの後、Viewの描画前に呼び出す */ @Override void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } /** * Controllerの後、Viewの描画後に呼び出す */ @Override void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { if (log.isInfoEnabled() && response != null) { if (LOGGING_METHOD.contains(request.method)) { log.info("Response status:${response.status}") } } } }
・postHandle()でもmodelAndViewの内容をデバッグ出力してもいいですね
・コントローラ呼び出し結果
2017-10-14 10:26:45.531 INFO 1048 --- [nio-8080-exec-3] sample.app.common.ControllerInterceptor : Request uri: GET /product/index/ 2017-10-14 10:26:45.543 INFO 1048 --- [nio-8080-exec-3] sample.app.common.ControllerInterceptor : Response status:200
コメントを残す