Spring
<Spring> 인터셉터(Interceptor)
나의 오류는 누군가 겪었던 오류
2023. 12. 11. 22:58
인터셉터
→ 공통의 서비스를 구현할 때 사용 (ex 권한체킹할때)
controller의 매핑메소드가 실행되기 전, 후, 응답처리 후 기능을 구현
인터셉터 구현하기
→ Spring이 제공하는 HandlerInterCeptor인터페이스를 구현한 클래스를 선언
인터페이스에 정의된 필요한 추상메소드를 재정의
preHandler()
postHandle()
afterComplition()
LogerInterceptor.java 파일
public class LoggerInterceptor implements HandlerInterceptor {
// private Logger logger = LoggerFactory.getLogger(LoggerInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler)
throws Exception {
// 매핑된 매핑메소드를 실행하기 전에 실행할 로직을 설정
// true : 매핑메소드 정상실행
// false : 매핑메소드 실행하지 않음
log.debug("------ 인터셉터 prehandle 실행 ------");
log.debug(request.getRequestURI());
log.debug("----------------------------------");
// Object handle : 실행될 메소드에 대한 정보를 저장한 객체
// 클래스, 메소드의 정보를 가져올 수 있음
HandlerMethod hm = (HandlerMethod)handler;
// 실행 클래스 가져오기
Object controller = hm.getBean();
log.debug("클래스 : {}",controller);
Method m = hm.getMethod();
log.debug("메소드명 : " + m.getName());
return true;
//return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
log.debug("----- 인터셉터 postHandle 실행 -----");
log.debug("응답화면 : " + modelAndView.getViewName());
Map modelData = modelAndView.getModel();
log.debug("model : {}", modelData);
log.debug("---------------------------------");
}
}
LoginCheckInterceptor.java 파일
public class LoginCheckInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 로그인정보확인
HttpSession session = request.getSession();
Member loginMember = (Member)session.getAttribute("loginMember");
if(loginMember == null) {
// 로그인 안하고 접근함!
request.setAttribute("msg", "로그인 후 이용할 수 있는 서비스입니다 :( ");
request.setAttribute("loc", "/");
request.getRequestDispatcher("/WEB-INF/views/common/msg.jsp")
.forward(request, response);
return false;
}
return true;
}
}
bean으로 등록하기
<!-- 인터셉터 적용설정하기 -->
<beans:bean id="loginCheckInterceptor"
class="com.bs.spring.common.interceptor.LoginCheckInterceptor"/>
<interceptors>
<interceptor>
<mapping path="/member/*"/>
<beans:bean class="com.bs.spring.common.interceptor.LoggerInterceptor"/>
<!-- 일회용으로는 이렇게! -->
</interceptor>
<interceptor>
<mapping path="/demo/*"/>
<!-- 제외할 서블릿 설정 -->
<exclude-mapping path="/demo/demoList.do"/>
<!-- 계속쓸거라면 ref로 참조해서쓰는것이 나을듯! -->
<beans:ref bean="loginCheckInterceptor"/>
</interceptor>
</interceptors>
적용대상설정하기
- url 패턴으로 설정
- xml의 <interceptors>태그 <interceptor url=””,[옵션]> 자식태그를 선언
비교!
- filter : request →(사이에 필터) tomcat → springweb → tomcat → response
- interceptor : request → tomcat → springweb →
(사이에 필터링 할 수 있는 것 : 인터셉터 (3가지상황에 대해서 로직처리) : 전 후 응답후)
controller method() → tomcat → response