위, 우리는 필터 (필터)와 수신기 (수신기)와 유사한 서블릿, 믿지 않는를 사용하여, 사실, 서블릿의 사용을 도입? 설명 내 말 잘 들어.
필터 (필터) 구현
@WebFilter(filterName="myFirstFilter",urlPatterns="/*")
public class myFirstFilter implements Filter {
@Override
public void init(FilterConfig config){
System.out.println("init()");
}
@Override
public void destroy() {
System.out.println("destroy()");
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
throws IOException, ServletException {
System.out.println("doFilter()");
arg2.doFilter(arg0, arg1);
}
}
속성은 선택 FILTERNAME이고 인터페이스 javax.servlet.Filter 필터를 구현하는 클래스의 정의 @WebFilter는 필터의 이름을 선언하고, 특성 필수 urlPatterns에서, URL 필터링 패턴을 지정할 것이다.
물론, 그 댓글을 @ServletComponentScan TestApplication.java에 추가해야합니다 :
@ServletComponentScan
@SpringBootApplication
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
}
페이지를 열 무료, 관찰 할 수있는
필터 역할을했다.
이 리스너 (리스너) 구현
어떤 예를 들어 예제 ServletContextListener를 타고, 위, 청취자와 동일 TestApplication.java
@WebListener
public class MyFirstListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContex begin()");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("ServletContex destroy()");
}
}
청취자 등록 @WebListener 나타낸다. 우리는 직접 TestApplication.java, 관찰 할 수 실행
역할을 우리의 청취자를 증명한다.
인터셉터 (3) (의 HandlerInterceptor) 구현
자바 웹 프로젝트에서 웹 요청을 필터링하는 필터를 사용하는 것 외에도, 우리는 또한 인터셉터를 사용할 수 있습니다. 둘 사이의 차이들은 인터셉터는 스프링에 의해 제공되는 동안 필터 서블릿 API는 점이다.
사실, 요격 기능과 필터는 매우 다르지 않다, 그러나 그것의 제어 능력. 우리는 콘텐츠를 요청 인터셉터를 수정할 수 없습니다, 그러나 우리는 요청의 실행을 일시 중단 할 수 있습니다.
인터셉터는 세 단계를 필요로 구현 :
- 클래스 만들기 인터셉터 인터페이스의 HandlerInterceptor를 구현
- 인터페이스 WebMvcConfigurer를 구현하는 클래스를 생성
- 맞춤 인터셉터의 예는 다음 체인 블록에 객체를 추가
다음 시뮬레이션 우리 코드
//拦截器1
public class MyFirstInterceptor implements HandlerInterceptor{
// 只有返回true才会继续向下执行,返回false取消当前请求
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("在请求处理之前进行调用 MyFirstInterceptor");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("请求处理之后,视图被渲染之前进行调用 MyFirstInterceptor");
}
//主要是用于进行资源清理工作
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("请求结束之后,渲染视图之后进行调用 MyFirstInterceptor");
}
}
//拦截器2
public class MySecondInterceptor implements HandlerInterceptor{
// 只有返回true才会继续向下执行,返回false取消当前请求
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("在请求处理之前进行调用 MySecondInterceptor");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("请求处理之后,视图被渲染之前进行调用 MySecondInterceptor");
}
//主要是用于进行资源清理工作
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("请求结束之后,渲染视图之后进行调用 MySecondInterceptor");
}
}
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//多个拦截器组成一个拦截器链,addPathPatterns 用于添加拦截规则,excludePathPatterns 用于排除拦截
registry.addInterceptor(new MyFirstInterceptor()).addPathPatterns("/**");
registry.addInterceptor(new MySecondInterceptor()).addPathPatterns("/**");
}
}
브라우저에서 http를 입력 : // localhost를 : 8080 / 안녕하세요, 콘솔 출력은 다음과 같습니다 :
인터셉터 및 필터는 차이가 있습니다, 오직 요청의 DispatcherServlet 후 서블릿 요청 정의는에서, 인터셉터 체인을 취할 것 그것은 차단되지 않습니다. 그리고 한 필터링 규칙은 서블릿 필터와 같은 필터는 올 사람이다.
참조 : 봄 부팅 필터, 청취자
봄 부팅 인터셉터