Interceptor를 활용한 접속자 정보 저장

givepro·2022년 3월 24일
0

spring boot

목록 보기
2/2

Interceptor란?

Interceptor란 컨트롤러에 들어오는 요청 HttpRequest와 컨트롤러가 응답하는 HttpResponse를 가로채는 역할을 합니다.인터셉터는 관리자만 접근할 수 있는 관리자 페이지에 접근하기 전에 관리자 인증을 하는 용도로 활용될 수 있습니다.

Filter와 Interceptor의 차이

  1. 호출 시점
    Filter는 DispatcherServlet이 실행되기 전 , Interceptor는 DispatcherServlet이 실행된 후

  2. 설정 위치
    Filter는 web.xml , Interceptor는 spring-servlet.xml

  3. 구현 방식
    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;
    }
}

HandlerInterceptorAdapter를 상속하면 여러 메서드를 오버라이딩 가능

  • preHandle : Request가 들어오고 Controller에 넘어가기 직전에 처리
  • postHandle : Controller에서 요청이 다 마무리하고, View로 Rendering하게 전에 처리
  • afterCompletion : Controller에서 요청이 다 마무리되고, View로 Rendering이 끝난후 처리
profile
server developer

0개의 댓글