Spring | Interceptor

새니·2023년 6월 22일
0

spring

목록 보기
7/13
post-thumbnail

Interceptor

웹 애플리케이션에서 요청과 응답을 가로채서 처리하는 기능을 제공하는 Spring Framework의 구성요소이다.

인터셉터의 역할

  1. 사전 처리 : 클라이언트의 요청이 컨트롤러에 도달하기 전 사전에 필요한 작업을 수행한다.
    ex) 로그인 여부를 확인하거나 요청의 유효성을 검사하는 등의 작업을 수행한다.

  2. 사후 처리 : 컨트롤러가 요청을 처리하고 응답을 반환한 후 추가적인 작업을 수행한다.

  • 웹 요청의 처리 전/후에 추가적인 작업을 수행하는데 유용하다.
    예를 들면! 인증 및 권한 검사, 로깅, 캐싱, 트랜잭션 관리 등의 기능을 인터셉터를 통해 구현 할 수 있다. 이를 통해 코드의 재사용성과 유지보수성을 향상 시킬수 있다!

[인터셉터 만들기]

1. HandlerInterceptor 인터페이스를 구현해서 만든다.

  • preHandle : Controller 실행 이전에 호출 되는 메소드

  • postHandle : Controller 실행 이후에 호출 되는 메소드

  • afterCompletion : 응답된 이후에 호출 되는 메소드!

  • 실행되는 시점

2. servlet-context.xml 에 bean 설정을 하고 interceptor 목록에 등록을 하고 맵핑을 해준다.

1. MyInterceptor 객체를 만들어서 Bean으로 관리해준다. (id값을 사용하는 이유는 설정할때 불러오기 위해서)

2. 인터셉터 등록!

  • interceptor는 여러개 등록을 할 수가 있다.
  • servlet-context.xml 파일에서 인터셉터를 설정하고 등록함으로써, 해당 인터셉터들은 웹 애플리케이션의 요청과 응답 처리 과정에서 동작하게 된다.


😶 예시를 통해 알아보자!

[MyInterface.class]

MyInterface 클래스에 호출 될 메소드를 만든다!
실행의 흐름을 확인하기 위해 콘솔에 출력되게 호출을 해주기로 했다!

[home.jsp]

  • 놀러가기 링크를 만들어준다!

Home 화면에서 놀러가기 링크를 눌러주면 ?!

preHandle() 메소드가 실행되고

console에서도 순서대로 실행되는 것을 확인 할 수 있다 !

😶 한발 더 나아가기!

  • 가상으로 로그인이 필요한 페이지에 접속 할때 로그아웃 상태로는 접속이 안되게 하는 동작을 구현해보자!

[home.jsp]

  • home.jsp 페이지에서 로그인 페이지와 로그아웃 페이지/ 로그인이 필요한 개인정보 페이지의 링크를 만든다.

  • <c:if> 태그를 이용해서 sessionScope의 갑의 존재여부에 대한 확인 메세지를 나타내는 코드를 작성해준다.

[loginIntercepte.java]

  • 인터페이스를 구현해서 만든다.

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
	         throws Exception {
	      //세션 객체의 참조값을 얻어와서 
	      HttpSession session=request.getSession();
	      String id=(String)session.getAttribute("id");
	      //만일 로그인을 하지 않았다면
	      if(id == null) {
	         //로그인 페이지로 리다이렉트 이동 시키고 false 를 리턴한다.

	         //원래 가려던 url 정보 읽어오기
	         String url=request.getRequestURI();
	         //GET 방식 전송 파라미터를 query 문자열로 읽어오기 ( a=xxx&b=xxx&c=xxx )
	         String query=request.getQueryString();
	         //특수 문자는 인코딩을 해야한다.
	         String encodedUrl=null;
	         if(query==null) {//전송 파라미터가 없다면 
	            encodedUrl=URLEncoder.encode(url);
	         }else {
	            // 원래 목적지가 /test/xxx.jsp 라고 가정하면 아래와 같은 형식의 문자열을 만든다.
	            // "/test/xxx.jsp?a=xxx&b=xxx ..."
	            encodedUrl=URLEncoder.encode(url+"?"+query);
	         }
	         
	         //3. 로그인을 하지 않았다면  /users/loginform.do 페이지로 리다이렉트 이동 시킨다. (HttpServletResponse)
	         String cPath=request.getContextPath();
	         response.sendRedirect(cPath+"/users/loginform?url="+encodedUrl);
	         return false;
	      }
	      
	      //로그인을 했다면 흐름을 이어간다.
	      return true;
	   }
  • 로그인의 여부를 확인해서 로그인이 되었다면 개인정보 페이지로 이동/ 로그인 되어있지 않은 상태라면 로그인 페이지로 이동하는 코드를 작성한다.

  • 요청된 후와 추가적인 작업은 없기때문에 작성하지 않았음.

[servlet-context.xml]

  • /users/* 패턴에 해당하는 URL에 인터셉터를 적용하도록 지정한다.
    /users/로 시작하는 모든 URL에 대해 인터셉터가 동작한다는 의미

  • <exclude-mapping>
    /users/loginform/users/login 패턴에 해당하는 URL은 인터셉터의 적용을 제외
    로그인 폼과 로그인 처리 URL은 인터셉터의 영향을 받지 않도록 설정하는 것

  • <beans:ref> 요소: loginInterceptor라는 이름의 빈을 참조하여 해당 인터셉터를 등록한다.

이 설정을 통해 /users/ 로 시작하는 URL에 대해 인터셉터가 동작하도록 설정되고, 로그인 폼과 로그인 처리 URL은 인터셉터의 영향을 받지 않는다.


😘 결과


🤔 로그인 안된 상태로 개인정보페이지로 간다면 ?

  • loginform 페이지로 요청

😊 로그인 후

profile
새니의 뒤죽박죽 개발 일기📝

0개의 댓글