Controller共通処理

コントローラ共通処理を書きたくなったので、調べてみました。
今回はログ出力の記事になりますが、応用すればログイン管理なども簡単にできそうです。

[広告]
[広告]

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 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}")
			}
		}
	}
}
・性能に影響が出ないようにlog.isInfoEnabled()でログ出力判定を行っています
・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

コメントを残す

メールアドレスが公開されることはありません。