실행시점은 차이가 있음
인터셉터 중 핸들러인터셉터는 필터의 일종이긴 하나, 요청컨트롤러가 있고 확인이 된 후에 실행(컨트롤러 요청 전후) 됨
핸들러 인터셉터는 DispatcherServlet
이 컨트롤러를 호출하기 전과 후에 요청과 응답을 참조하거나 가공할 수 있는 일종의 필터
필터와 인터셉터의 자세한 차이를 알고싶다면 여기로
HandlerInterceptorAdaptor 클래스를 상속받은 뒤, 자신이 원하는 메서드만 오버라이딩하면 된다.
~'Adaptor'가 붙어있는 클래스
인터페이스 구현체이나, 안에 내용이 없음. 내가 구현하고자 하는 메서드만 재구성하면 됨. 즉 구현하지 않아도 될 메서드들은 구현하지 않음! 번거로움이 줄어든다.
HandlerMapping에 인터셉터 설정 (servlet-context.xml 에 등록)
Interceptor 실행순서?
preHandle
: HandlerMapping에 등록된 순서대로 실행
postHandle
: 등록 순서와 역순으로 실행
view 렌더링 한 후: ‘Interceptor 처리 완료 후’ 혹은 ‘뷰 생성 후’라 할 수 있으며, 등록된 순서의 반대로 afterCompletion()
실행
<!-- interceptor 등록 -->
<interceptors>
<interceptor>
<mapping path="/member/mypage/**"/>
<exclude-mapping path="/member/mypage/help"/>
<beans:bean class="com.ny.mm.interceptor.AuthCheckInterceptor" />
</interceptor>
</interceptors>
목표:
세션에 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;
}
}
<%@ 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>