[spring boot] interceptor로 특정 ip로 접속시 에러페이지 이동

jihun Choi·2023년 9월 2일
1

안녕하세요 오늘은 interceptor로 특정 ip로 접속시 에러페이지로 이동시키는 로직을 구현해보도록 하겠습니다

😎 interceptor란?

컨트롤러(Controller)의 '핸들러(Handler)'를 호출하기 전과 후에 요청과 응답을 참조하거나 가공할수 있는 일종의 필터입니다

주로 로그인 체크와 권한 체크를 하기위해 사용합니다

스프링에서 제공하는 org.springframework.web.servlet.HandlerInterceptor 인터페이스를 구현하거나,
org.springframework.web.servlet.handler.HandlerInterceptorAdapter 추상클래스를 오버라이딩 함으로써

자신만의 인터셉터를 만들수 있습니다.


😎 interceptor 메서드?

1) preHandle()

  • 컨트롤러 호출전에 실행
  • 리턴값이 boolean이다. 리턴이 true 일경우 preHandle() 실행후 핸들러에 접근한다. false일경우 작업을 중단하기 때문에 컨트롤러와 남은 인터셉터가 실행되지않는다.

2) postHandle()

  • 핸들러가 실행은 완료 되었지만 아직 View가 생성되기 이전에 호출된다.
  • ModelAndView 타입의 정보가 인자값으로 받는다. 따라서 Controller에서 View 정보를 전달하기 위해 작업한 Model 객체의 정보를 참조하거나 조작할수 있다.

3) afterCompletion()

  • 모든 View에서 최종 결과를 생성하는 일을 포함한 모든 작업이 완료된 후에 실행된다.
  • 요청 처리중에 사용한 리소스를 반환해주기 적당한 메서드 이다.

😎 구현 로직

  1. interceptor 구현
package com.example.sessionEx.intercept;

import com.example.sessionEx.service.MainService;
import com.example.sessionEx.util.SessionUtil;
import com.example.sessionEx.vo.IpBanVO;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import java.net.InetAddress;
import java.util.List;

@RequiredArgsConstructor
public class MainInterceptor implements HandlerInterceptor {

    private final MainService mainService;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        InetAddress ia = InetAddress.getLocalHost();

        boolean a = mainService.getIpBanList()
                .stream()
                .anyMatch(ip -> ip.getIp().equals(ia.getHostAddress()));

        if(a == true){
            response.sendRedirect(request.getContextPath()+"/error");
            return false;
        }

        return HandlerInterceptor.super.preHandle(request, response, handler);
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }

}
  • preHandle로 interceptor에 진입할 때 InetAddress 클래스를 통해 클라이언트 ip주소를 가져온뒤 DB에서 접근이 금지된 ip주소 정보를 가져와 클라이언트 ip주소와 비교하여 같을 경우 에러페이지로 보내줍니다
  1. config 설정
	@Configuration
    public class WebConfig implements WebMvcConfigurer {

    	@Autowired
    	private MainService mainService;

    	@Override
    	public void addInterceptors(InterceptorRegistry registry) {
     	   registry.addInterceptor(new MainInterceptor(mainService)).excludePathPatterns("/error");
	    }

	}
  • 인터페이스 config를 설정하는 파일입니다 /error로 url 호출할경우 interceptor를 타지않도록 설정하였습니다

로직 구현 후 실행결과 금지된 ip로 접근하였을 경우 에러페이지로 이동하는것을 확인하였습니다 다음에는 더 재미있는 소재로 찾아뵙겠습니다 감사합니다.

profile
성장을 위해 열심히 노력하는 개발자 입니다

0개의 댓글