1) 개념
인터셉터는 말 그대로 사용자의 request 를 가로채는 역할을 수행합니다.
예를 들어 로그인을 하지 않았는데 마이페이지에
URL 을 통해서 접속을 하면 안되겠죠?
이러한 경우 해당 주소를 입력하면
request 를 가로채서 로그인 화면으로 보낸다던가 로그인을 유도하는 알림창을 띄우고 해당 페이지로 접속하지 못하게 하는 것이죠.
2) 설정
Maven 프로젝트 기준 servlet-context에 설정하게 됩니다.
설정 방식은 보통
인터셉터의 조건을 작성하는
클래스를 작성하고 해당 인터셉터를 적용시키지 않을
예외 페이지를 설정하게 됩니다.
pulbic class LoginInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
HttpSession session = rquest.setSession();
if(session.getAttibute("login") != null) {
return true;
}
String requestURL = request.getRequestURL().toString();
requestURL = URLEncoder.encode(requestURL, "UTF-8");
String contextPath = request.getContextPath();
response.sendRedirect(contextPath + "/member/login?url=" + requestURL);
return false
}
@Override
public void postHandle(HttpServletRequest reqeust, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse resposne, Object handler, Exception ex) throws Exception {
}
}
<interceptors>
<interceptor>
<mapping path="/board/**"/>
<beans:bean id="LoginInterceptor"
class="com.velog.interceptor.LoginInterceptor"/>
</interceptor>
</interceptors>
부연 설명을 드리자면 해당 코드에서는 preHandle 메서드에서 사전 차단되기 때문에 혹시 모를 예외사항이 없다면 굳이 postHandle과 afterCompletion 에 코드를 작성하여 작업을 수행할 필요는 없습니다.
또한 하나의 인터셉터 클래스에 하나의 메서드가 작성되어야 한 것은 아니지만 해당 클래스의 의미에 부합하도록 작성하고 하나의 메서드가 하나의 역할만 수행하도록 명확하게 나눠주는 과정은 필수입니다.