実行順序の間に明確な動作原理SpringMVCのビュー、およびインターセプター&フィルターの違い

まず、図はSpringMVCインターセプター要求に応じてフィルタ処理を明確にする場合

要求応答の場合のフィルタと傍受プロセスSpringMVC

  • Webサーバー:クライアントとサーバ間の要求と応答を処理するための手順をインターワーキングネットワーク、Webサーバーは要求することができ、応答は、HTTPプロトコル処理に準拠する必要があります。ぶっきらぼうには、Webサーバ、Webサーバ、およびクライアントへのデータ応答をクライアントから渡されたデータを要求する、と述べた文字列である、またはWebサーバーが唯一の静的リソースを扱うことができます。クライアントはHTTP要求を開始すると、クライアントから要求されたコンテンツは、静的リソースWebサーバーを最初にチェックされるかどうか。それは静的なリソースへの直接静的リソース、Webサーバである場合は、クライアントにバックアップ。コンテンツクライアント発見要求は、動的なコンテンツである場合には、Webサーバーは転送サーブレットコンテナへの要求が処理されます。サーブレットコンテナは、転送扱ったWebサーバーへの応答は、HTTPプロトコルの形式にHTTPレスポンスに適合するように変換されます。
  • サーブレットコンテナ:クライアントとWebサーバー間の動的相互作用のサーブレットの拡張機能の一部をサポートするWebサーバー。単刀直入に言えば、それは、Webサーバーが当然サーブレットコンテナ与えられたHTTPリクエストを、理解できないです。その後、要求の結果として解釈サーブレットコンテナは、Webサーバー、クライアントに転送要求に応じて、Webサーバーが理解されるであろう。
  • フィルタフィルタ:フィルタフィルタ同じと動的コンテンツを生成するために、サーブレットコンテナによって管理されるJavaサーブレットWebコンポーネントに基づいています。その方法は、のdoFilter()をフィルタリングし、フィルタのフィルタ初期化のinit()が実行される、など)(破壊するサーブレットコンテナによって呼び出され破壊します。なお、Webサーバは、HTTPリクエストの動的コンテンツ、サーブレットコンテナに転送要求を発見されたとき。サーブレットコンテナは、プロセスに対応するサーブレットを見つけるために、最初あったが、マッチング要求フィルタとフィルタがある場合、フィルタサーブレットコンテナがプロセスにサーブレットに再度要求を処理する第一のフィルタを取得し、あろう。フィルタは、サーブレットは、サーブレット応答配らフィルターフィルターが再処理され続けるフィルターのコールバックの使用は、ですので。容器スプリングBeanが使用されるフィルタのフィルタ内に注入されていないので、図から分かる。、サーブレットコンテナのライフサイクルは、以前&スプリング容器よりも長いです。この機能は、一般的にも、主に要求と応答を処理するためではなく、特定のビジネスプロセスに使用される直接の結果フィルターです。
  • インターセプタインターセプタ:インターセプタは春で管理されているインターセプタ、春IOCは、アセンブリの容器に保存されている、Springのアスペクト指向プログラミングAOPの実装です。インターセプターを達成するためにリフレクションを使用して、動的プロキシに基づいています。この春IOCと春によって制御されているのと同じライフサイクルにおける他の成分は、インターセプタはビーン春IOCコンテナ他のビジネスプロセスに注入することができます。もちろん、インターセプタはまた、完全な効果フィルタのフィルタを実現することができます。だから、より強力なインターセプタは、インターセプタも推奨されます。
  • SPRINGMVC:SpringベースのWebコンポーネント、動的要求処理。そのコアクラスのDispatcherServletは、一般にフロントエンドコントローラと呼びます。クライアントからのすべての要求、要求は、サーブレットコンテナへの応答を返すからのDispatcherServletによって転送されます。上記に示された特定の操作手順は、以下のソースによって解釈されるであろう。

フィルターと迎撃部分の解釈の違いがすでにクリア

二、プロジェクトSpringBootで使用するためのフィルタフィルタ

フィルタのフィルタ元配置スプリングプロジェクトは、web.xmlに構成されています。SpringBootのweb.xmlプロジェクト内のファイルが、新しいコンフィギュレーションなし。

1、注釈モード

次の2つの注釈プログラムは、あります。

  • @WebFilter+ @Component 或 @Configuration+(@Orderオプション)
@Slf4j
@Order(2)
@Component
@WebFilter(urlPatterns="/*", filterName="filter2")
public class Filter2 implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("{}初始化完成",this.getClass().getName());
    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        log.info("{}执行过滤开始....",this.getClass().getName());
        filterChain.doFilter(servletRequest,servletResponse);
        log.info("{}执行过滤结束....",this.getClass().getName());
    }

    public void destroy() {
        log.info("{}销毁",this.getClass().getName());
    }
}
  • @WebFilter+ @ServletComponentScan("Filter所在包目录")+(@Orderオプション)
@Slf4j
@Order(2)
@WebFilter(urlPatterns="/*", filterName="filter2")
public class Filter2 implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("{}初始化完成",this.getClass().getName());
    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        log.info("{}执行过滤开始....",this.getClass().getName());
        filterChain.doFilter(servletRequest,servletResponse);
        log.info("{}执行过滤结束....",this.getClass().getName());
    }

    public void destroy() {
        log.info("{}销毁",this.getClass().getName());
    }
}
@ServletComponentScan("com.mapc.j2ee.filter")
@SpringBootApplication
public class J2eeFilterInterceptorServletApplication {

    public static void main(String[] args) {
        SpringApplication.run(J2eeFilterInterceptorServletApplication.class, args);
    }

}

SpringBoot入口クラスの追加@ServletComponentScan注釈を、またはに、FilterConfigカスタムクラスを追加@ServletComponentScan+の@Configuration組成注釈ができます。

図2に示すように、符号化

使用FilterRegistrationBeanの注射。

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean registerFilter1(){
        FilterRegistrationBean filterRegistrationBean=new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new Filter1());
        filterRegistrationBean.setOrder(1);
        filterRegistrationBean.setUrlPatterns(Collections.singleton("/*"));
        return filterRegistrationBean;
    }

    @Bean
    public FilterRegistrationBean registerFilter2(){
        FilterRegistrationBean filterRegistrationBean=new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new Filter2());
        filterRegistrationBean.setOrder(2);
        filterRegistrationBean.setUrlPatterns(Collections.singleton("/*"));
        return filterRegistrationBean;
    }

}

三、SpringBootプロジェクトで使用するためのインターセプタインターセプタ

1、相続WebMvcConfigurationSupport+ @Configuration 或 @Componentノート

@Configuration
public class InterceptorConfig extends WebMvcConfigurationSupport {

    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new Interceptor1()).addPathPatterns("/**");
        super.addInterceptors(registry);
    }
}
@Slf4j
@Order(2)
public class Interceptor1 implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("{}请求处理前拦截",this.getClass().getName());
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.info("{}请求处理后返回ModelAndView拦截",this.getClass().getName());
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        log.info("{}请求处理后返回给前端视图拦截",this.getClass().getName());
    }
}

四、SpringMVC動作原理ソースの解釈

時間通りにあり補わ


参考文献:
[1]:Javaサーブレット3.1仕様、「Javaサーブレット3.1仕様」中国語の翻訳と例
[2]:サーブレットコンテナとは何ですか?

公開された35元の記事 ウォン称賛32 ビュー90000 +

おすすめ

転載: blog.csdn.net/u012995888/article/details/103398278