Interceptor란 컨트롤러에 들어오는 요청 HttpRequest와 컨트롤러가 응답하는 HttpResponse를 가로채는 역할을 합니다.인터셉터는 관리자만 접근할 수 있는 관리자 페이지에 접근하기 전에 관리자 인증을 하는 용도로 활용될 수 있습니다.
호출 시점
Filter는 DispatcherServlet이 실행되기 전 , Interceptor는 DispatcherServlet이 실행된 후
설정 위치
Filter는 web.xml , Interceptor는 spring-servlet.xml
구현 방식
Filter는 web.xml에서 설정을 하면 구현이 가능하지만, Interceptor는 설정은 물론 메서드 구현이 필요합니다.
@Component
public class AdminLogInterceptor extends HandlerInterceptorAdapter {
private AdminLogService adminLogService;
@Autowired
public AdminLogInterceptor(AdminLogService adminLogService) {
this.adminLogService = adminLogService;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
adminLogBuildAndInsertLog(request, response);
super.afterCompletion(request, response, handler, ex);
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return super.preHandle(request, response, handler);
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
super.postHandle(request, response, handler, modelAndView);
}
private void adminLogBuildAndInsertLog(HttpServletRequest request, HttpServletResponse response) {
AdminLog adminLog = AdminLog.builder()
.ip(getIpAddress(request))
.uri(request.getRequestURI())
.status(String.valueOf(response.getStatus()))
.build();
adminLogService.insertAdminLog(adminLog);
}
private String getIpAddress(HttpServletRequest request) {
String ipAddress = request.getHeader("X-Forwarded-For");
if (ipAddress == null) ipAddress = request.getRemoteAddr();
return ipAddress;
}
}
HandlerInterceptorAdapter를 상속하면 여러 메서드를 오버라이딩 가능