스프링14_필터와 인터셉터

charl hi·2022년 1월 28일
0

Spring

목록 보기
15/25

필터

web.xml

에 등록한다면

	<!-- 우리가 만든 필터 등록 -->
	<filter>
		<filter-name>abcFilter</filter-name>
		<filter-class>com.kh.app19.filter.MyFilter</filter-class>
	</filter>
	
	<filter-mapping>
		<filter-name>abcFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

MyFilter

@WebFilter(urlPatterns = "/*")
@Component(value = "Filterzzzz")
public class MyFilter implements Filter{

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {

		System.out.println("filter~!~~~!");
		chain.doFilter(request, response);
	}

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

}

@Component 하면



스프링의 필터를 이용하기

proxy

  • myFilter를 찾아 한 번 감싸주는 역할

web.xml

	<!-- 우리/스프링이 만든 필터 등록 -->
	<filter>
		<filter-name>abc</filter-name>
		<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
	</filter>
	
	<filter-mapping>
		<filter-name>abc</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	


root-context.xml

	<bean id="abc" class="com.kh.app19.filter.MyFilter">
	</bean>

  • 스프링 밖에 FILTER




servlet-context & root-context

  • sc에 있던 걸 rc로 다 옮기자



인터셉터

필터와의 차이점

1) 디스패처 서블릿 <-> 컨트롤러 에서의 요청을 가로챈다.

  • preHandle : 컨트롤러로 가기 전
  • postHandle : 컨트롤러 갔다와서 나올 때

2) 화면을 만들고 나서 ?????

  • afterCompletion : 클라이언트에게 가기 전에, 뷰 랜더링 후
    2-1???) 디스패처 서블릿 <- 뷰리졸버 에서의 요청을 가로챈다.
    2-2??) 뷰 -> html 로 response 에서의 요청을 가로챈다.

필터는 하지만 인터셉터가 못하는 것

  • 디스패처 서블릿 -> 컨트롤러 에서의 404에러를 처리하지 못한다.


필터

  • 클라이언트 -> 스프링 컨테이너 로 request 에서


인터셉터 만드는 방법 2가지

  1. HandlerInterceptor 인터페이스 구현하기
  2. HandlerInterceptorAdapter 클래스 상속받기


MyInterceptor


/*
 인터셉터 만드는 방법 2가지
 1. HandlerInterceptor 인터페이스 구현하기
 2. HandlerInterceptorAdapter 클래스 상속받기
 */

public class MyInterceptor extends HandlerInterceptorAdapter{

	//인터셉터는 3가지 시점에 관여를 한다.
	//3가지 메소드 ()
	//1) preHandle
	
	//1. handle (컨트롤러 가기) 전에
	//리턴값에 따라 요청 통과시킬지 말지 결정 가능
	//핸들러 : 처리할 메소드 정보 확인 가능
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		System.out.println("preHandle called ...");
		System.out.println("handler : "+handler);
		//HomeController의 home(Locale, Model)가 호출됨
		
		return true;
	}
	
	//2. handle 끝나고
	//리턴값이 없음 -> 우리가 커트할 수 없음
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println("postHandle called~~");
		super.postHandle(request, response, handler, modelAndView);
	}
	
	//3. 화면 넘겨주기 전에
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		System.out.println("afterCompletion called!!!!!!!!!!!!");
		System.out.println("ex: "+ ex);
		super.afterCompletion(request, response, handler, ex);
	}
}

  • 예외나면!!



servlet-context.xml

	<interceptors>
		<interceptor>
			<mapping path="/**"/>
			<!-- 특정 경로만 인터셉트 안함 -->
			<exclude-mapping path="/test"/>
			<beans:bean class="com.kh.app19.interceptor.MyInterceptor"/>
		</interceptor>
	</interceptors>


HomeController

	@RequestMapping("test")
	@ResponseBody
	public String test() {
		return "test";
	}
	


0개의 댓글