>  기사  >  Java  >  Springboot에서 필터의 원리와 등록방법은 무엇인가요?

Springboot에서 필터의 원리와 등록방법은 무엇인가요?

WBOY
WBOY앞으로
2023-05-11 20:28:041411검색

    1. 필터

    먼저 웹서버의 필터 위치를 살펴보세요. 필터는 이전 처리가 완료된 후 처리를 위해 다음 필터로 전달되는 체인입니다.

    Springboot에서 필터의 원리와 등록방법은 무엇인가요?

    1.1 필터 인터페이스 정의

    public interface Filter {
        //初始化方法,整个生命周期中只执行一次。
        //在init方法成功(失败如抛异常等)执行完前,不能提供过滤服务。
        //参数FilterConfig用于获取初始化参数
        public void init(FilterConfig filterConfig) throws ServletException;
     
        //执行过滤任务的方法,参数FilterChain表示过滤器链,doFilter方法中只有执行chain.doFilter()后才能调用下一个过滤器的doFilter方法
        //才能将请求交经下一个Filter或Servlet执行
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;
     
        //销毁方法,当移出服务时由web容器调用。整个生命周期中destroy方法只会执行一次
        //destroy方法可用于释放持有的资源,如内存、文件句柄等
        public void destroy();
    }

    필터의 입력 매개변수는 요청과 응답입니다. 필터는 일반적으로 일부 확인, 확인 및 기타 작업과 같은 일부 전처리 작업을 수행하는 데 사용됩니다. F1.2 Custom Filter

    public class LoginFilter implements Filter {
        @Override
        public void destroy() {
            System.out.println("filter destroy method");
        }
        @Override
        public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain filterChain)
                throws IOException, ServletException {
            System.out.println("filter doFilter method ");
            // 继续传递下去
            filterChain.doFilter(arg0,arg1);
        }
        @Override
        public void init(FilterConfig arg0) throws ServletException {
            System.out.println("filter init method");
        }
    }

    2, SpringBoot 필터 등록 다양한 방법

    2.1 수동 등록

    @Configuration
    public class FilterConfig {
        @Bean
        public FilterRegistrationBean indexFilterRegistration() {
            FilterRegistrationBean registration = new FilterRegistrationBean(new LoginFilter());
            registration.addUrlPatterns("/");
            return registration;
        }
    }
    E

    2.2 검토

    2.2.1은 Filter@Webfilterrrrrrrrrrrrr

    @WebFilter(urlPatterns = "/",filterName = "filter1")
    @Order(1)
    public class LoginFilter implements Filter {
        @Override
        public void destroy() {
            System.out.println("filter destroy method");
        }
     
        @Override
        public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain filterChain)
                throws IOException, ServletException {
            System.out.println("filter doFilter method   1   ");
            filterChain.doFilter(arg0,arg1);
        }
     
        @Override
        public void init(FilterConfig arg0) throws ServletException {
            System.out.println("filter init method");
        }
    }
    e

    2.2.2.2 추가 @ 주석 ServletComponentScan을 시작 클래스로

    @SpringBootApplication
    @ServletComponentScan
    public class FilterTestApplication {
        public static void main(String[] args) {
            SpringApplication.run(FilterTestApplication.class, args);
        }
    }

    참고:

    @ServletComponentScan은 @WebFilter를 사용하여 모든 클래스를 스캔하고 이를 서블릿으로 등록합니다.

    시작 클래스에서 이 주석을 추가하지 않으면 필터에 구성 요소 주석을 추가하여 필터로 등록할 수도 있습니다.

    order 주석으로 필터 순서를 조정할 수 있습니다.

    2.3 servletContext를 통해 등록

    @Autowired ServletContext servletContext; servletContext.addFilter()

    3. 3.1 ServletContext

    웹 컨테이너 시작 시 각 웹 애플리케이션에 대해 ServletContext 객체가 생성되며 이 ServletContext 객체는 현재 웹 애플리케이션을 나타냅니다.

    ServletContext 객체는 웹 애플리케이션을 나타냅니다. 웹 애플리케이션의 모든 서블릿과 기타 리소스는 ServletContext 객체를 공유합니다.

    필요한 경우 ServletContext 객체를 통해 서블릿 간에 통신할 수 있습니다.

    ServletContext는 서버가 시작될 때 존재하고 서버가 종료될 때만 해제되는 전역 정보 저장 공간입니다. 사용자는 여러 요청을 가질 수 있습니다. 세션은 각 사용자마다 하나씩 있으며 모든 사용자는 하나를 공유합니다.

    ApplicationContext는 ServletContext의 구현 클래스입니다. 해당 등록 메소드가 있음을 알 수 있습니다. Springboot에서 필터의 원리와 등록방법은 무엇인가요?

    프로그램에서 ServletContext 가져오기

    3.1.1 자동 주입 사용

    @Autowired private ServletContext servletContext;
    3.1.2 요청 get servletContext

    ServletContext servletContext = request.getServletContext();
    3.1.3 Implement ServletContextListener

    @Component
    public class TestListener implements ServletContextListener {
        @Override
        public void contextInitialized(ServletContextEvent sce) {
            System.out.println(sce);
        }
    }
    3.2 ServletRegistrationBean

    Filter의 정의를 보면 웹필터 주석 내용과 동일함을 알 수 있습니다

    public class ServletRegistrationBean<T extends Servlet> extends DynamicRegistrationBean<ServletRegistration.Dynamic> {
        private static final String[] DEFAULT_MAPPINGS = new String[]{"/*"};
        private T servlet;
        private Set<String> urlMappings;
        private boolean alwaysMapUrl;
        private int loadOnStartup;
        private MultipartConfigElement multipartConfig;
        ......
        }

    일반적으로 개발 시 그의 하위 클래스인 FilterRegistrationBean을 사용합니다. , 위의 2.1을 사용하여 수동으로 등록하세요.

    위 내용은 Springboot에서 필터의 원리와 등록방법은 무엇인가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제