Spring handler 인터셉터

2019-08-20



필터와 인터셉터의 실행시기 차이?

실행시점은 차이가 있음
인터셉터 중 핸들러인터셉터는 필터의 일종이긴 하나, 요청컨트롤러가 있고 확인이 된 후에 실행(컨트롤러 요청 전후) 됨

핸들러 인터셉터

핸들러 인터셉터는 DispatcherServlet컨트롤러를 호출하기 전과 후에 요청과 응답을 참조하거나 가공할 수 있는 일종의 필터

필터와 인터셉터의 자세한 차이를 알고싶다면 여기로



HandlerInterceptor 어떻게 쓸까?

HandlerInterceptorAdaptor 클래스를 상속받은 뒤, 자신이 원하는 메서드만 오버라이딩하면 된다.

~'Adaptor'가 붙어있는 클래스
인터페이스 구현체이나, 안에 내용이 없음. 내가 구현하고자 하는 메서드만 재구성하면 됨. 즉 구현하지 않아도 될 메서드들은 구현하지 않음! 번거로움이 줄어든다.
  1. HandlerMapping에 인터셉터 설정 (servlet-context.xml 에 등록)

  2. Interceptor 실행순서?

    preHandle: HandlerMapping에 등록된 순서대로 실행

    postHandle: 등록 순서와 역순으로 실행

  3. view 렌더링 한 후: ‘Interceptor 처리 완료 후’ 혹은 ‘뷰 생성 후’라 할 수 있으며, 등록된 순서의 반대로 afterCompletion() 실행

1. servlet-context.xml 에 등록

<!-- interceptor 등록 -->
<interceptors>
    <interceptor>
        <mapping path="/member/mypage/**"/>
        <exclude-mapping path="/member/mypage/help"/>
        <beans:bean class="com.ny.mm.interceptor.AuthCheckInterceptor" />
    </interceptor>
</interceptors>



2. interceptor class 등록

목표:
세션에 loginInfo 속성이 존재하면 return true 해주기

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

    
//		1. 현재 요청에서 세션객체 받기
        HttpSession session = request.getSession(false);

//		2. loginInfo가 저장되어있는지,,
        if(session != null && session.getAttribute("loginInfo") != null) {
            return true;
        }

        //context 경로 지정해줘야한다. 
        response.sendRedirect(request.getContextPath() + "/login/form");

        return false;
	}
}


3. VIEW 등록 (jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>삐용삐용!!!!!!!!!!!! null pointer exception 발생!!!!!!!!!!!!</h1>
</body>
</html>


4. 결과페이지 확인

결과페이지