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 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
コメントを残す