평행코드

<Spring> 인터셉터(Interceptor) 본문

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

 

'Spring' 카테고리의 다른 글

<Spring> AOP (Aspect Orientied Programing)  (0) 2023.12.13
<Spring> 트랜잭션처리하기  (0) 2023.12.13
<Spring> bean validator 구현하는 방법  (1) 2023.12.11
<Spring> 로그 남기기  (2) 2023.12.11
<Spring legacy> Mybatis DB연결하기  (0) 2023.12.10