1. Interceptor란 무엇인가
- 사용자에게 요청을 받아 Controller 에게 요청을 건네주기 전( = preHandle ),
- 혹은 Controller를 통해 요청을 수행한 후 View를 구성하기 전( = postHandle ),
- 혹은 Controller를 통해 요청을 수행한 후 View도 구성된 후( = afterCompletion ).
총 3가지의 시기에 맞춰 소스쪽에서 추가 처리를 할 수 있도록 하는 클래스이다.
쉽게 말해 사용자의 요청을 처리하기 전/후에 추가작업을 해야한다면 interceptor를 사용해보는 방법을 생각할 수 있겠다.
이미지 출처 https://popo015.tistory.com/115
2. Interceptor 사용하기
Interceptor를 사용하기 위한 back 단 틀은 아래와 같다. 2가지를 준비해주면 된다.
- 필요한 Interceptor 클래스 선언 및 소스 생성
- dispatcher-servlet.xml에 interceptor 요소 추가
2-1. Interceptor 클래스 선언 및 소스 생성
아래는 IE로 접속하는 사용자의 접근을 차단 하기 위한 interceptor이다.
만들다 말았지만...
public class LoginInterceptor extends HandlerInterceptorAdapter {
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
String browser = “”;
String userAgent = request.getHeader(“User-Agent”);
If(userAgent.indexOf(“Trident”) > -1) {// IE
Browser = “ie”;
} else if(userAgent.indexOf(“Edge”) > -1) {// Edge
Browser = “edge”;
} else if(userAgent.indexOf(“Whale”) > -1) { // Naver Whale
Browser = “whale”;
} else if(userAgent.indexOf(“Opera”) > -1 || userAgent.indexOf(“OPR”) > -1) { // Opera
Browser = “opera”;
} else if(userAgent.indexOf(“Firefox”) > -1) { // Firefox
Browser = “firefox”;
} else if(userAgent.indexOf(“Safari”) > -1 && userAgent.indexOf(“Chrome”) == -1 ) { // Safari
Browser = “safari”;
} else if(userAgent.indexOf(“Chrome”) > -1) { // Chrome
Browser = “chrome”;
}
String redirectUrl = “”;
if(browser.equals(“ie”)) {
HttpSession session = request.getSession();
MemberVO memberVO = (MemberVO)session.getAttribute("sessionMember");
if ( memberVO != null && memberVO.getMemberId() != null ) {
redirectUrl = "/logout.edu";// 로그인되어 있는 경우 로그아웃시킴
} else {
redirectUrl = "/main.edu";
}
// 메인으로 리다이렉트
redirectUrl = "/main.edu";
modelAndView.addObject("restrictYesNo", "Y");
modelAndView.addObject("loginRedirectUrl", redirectUrl);
}
}
}
나는 HandlerInterceptorAdapter를 extends 했지만, HandlerInterceptor를 implements 해도 되고 HandlerInterceptorAdeptor를 extends 해도 된다.
인터페이스인 HandlerInterceptor와, 부모클래스인 HandlerInterceptorAdeptor의 차이는 각각의 타입 차이에 있다.
인터페이스이므로 구현하는 구현체는 인터페이스의 함수를 모두 작성해야한다.
즉, preHandle(), postHandle(), afterCompletion()을 모두 재정의 해야 한다.
HandlerInterceptorAdeptor는 추상클래스이므로 필요한 메서드만 재정의하면 된다.
전처리만 필요하다면 preHandle만 구현해도 상관없다.
2-2. dispatcher-servlet.xml ( = 서블릿 설정파일)에 interceptor 요소 추가
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/member/login"/> <!-- 로그인페이지 -->
<bean class="com.common.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
인터셉터를 servlet에 등록되도록 설정한다.
위의 소스대로라면 /member/login 으로 접근 했을 때 LoginInterceptor가 작동하게 될 것이다. 만약 다수의 url에 작동하되, 특정 url만 작동되지 않게 하려는 거라면 아래와 같이 설정한다.
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/*"/> <!-- 전체 url -->
<mvc:exclude-mapping path="/member/login"/> <!-- 작동 제외할 특정 url -->
<bean class="com.common.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
인터셉터는 하나만 설정 할 수 있는 건 아니고 여러개가 가능하다. 매핑하는 url도 마찬가지다. 필요한 만큼 작성하면 됨!
또한 인터셉터를 여러개 설정했다면 선언한 순서대로 작동하는데, postHandle이나 afterCompletion과 같은 후처리 메서드들은 역순으로 작동한다고 한다.
++ 나는 프로젝트에 이미 spring-webmvc 라이브러리 의존성이 알아서 포함되어있어서 문제 없었는데, 포함되지 않았다면 추가해주어야 한다.
'웹개발지식쌓기' 카테고리의 다른 글
Zoom Api 사용해보기 - 2 [JWT] (0) | 2022.08.30 |
---|---|
Zoom Api 사용해보기 - 1 (0) | 2022.08.29 |
[front] 페이스북 글 공유하기 포스팅 api (0) | 2022.08.03 |
[오류] cron 표현식 오류 - Encountered invalid @Scheduled method 'excute': For input string: "6L" (0) | 2022.06.17 |
[오류] 메이븐 오류 - java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet (0) | 2022.06.16 |