Interceptor를 활용한 접속자 정보 저장
Interceptor란?
Interceptor란 컨트롤러에 들어오는 요청 HttpRequest와 컨트롤러가 응답하는 HttpResponse를 가로채는 역할을 합니다.인터셉터는 관리자만 접근할 수 있는 관리자 페이지에 접근하기 전에 관리자 인증을 하는 용도로 활용될 수 있습니다.
Filter와 Interceptor의 차이
-
호출 시점
Filter는 DispatcherServlet이 실행되기 전 , Interceptor는 DispatcherServlet이 실행된 후 -
설정 위치
Filter는 web.xml , Interceptor는 spring-servlet.xml -
구현 방식
Filter는 web.xml에서 설정을 하면 구현이 가능하지만, Interceptor는 설정은 물론 메서드 구현이 필요합니다.
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;
}
}
@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를 상속하면 여러 메서드를 오버라이딩 가능
- preHandle : Request가 들어오고 Controller에 넘어가기 직전에 처리
- postHandle : Controller에서 요청이 다 마무리하고, View로 Rendering하게 전에 처리
- afterCompletion : Controller에서 요청이 다 마무리되고, View로 Rendering이 끝난후 처리
Author And Source
이 문제에 관하여(Interceptor를 활용한 접속자 정보 저장), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@givepro91/Interceptor를-활용한-접속자-정보-저장저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)