ホームページ  >  記事  >  Java  >  Spring MVC インターセプターの詳細な紹介

Spring MVC インターセプターの詳細な紹介

巴扎黑
巴扎黑オリジナル
2017-09-08 09:43:361348ブラウズ

Spring MVC のインターセプターは HandlerMapping レベルにあり、それぞれの HandlerMapping には独自のインターセプターが存在します。

Spring は springframework.web.servlet を提供します。 .HandlerInterceptor インターフェース、

org.springframework.web.servlet.handler.HandlerInterceptorAdapter アダプター、


このインターフェースを実装するか、このクラスを継承すると、独自のインターセプターを非常に簡単に実装できます。


次の 3 つのメソッドがあります:

アクションの前に実行:

 public boolean preHandle(HttpServletRequest request,
  HttpServletResponse response, Object handler);

ビューを生成する前に実行

 public void postHandle(HttpServletRequest request,
  HttpServletResponse response, Object handler,
  ModelAndView modelAndView);

リソースを解放するために使用できます

 public void afterCompletion(HttpServletRequest request,
  HttpServletResponse response, Object handler, Exception ex)

それぞれ前処理、後処理(サービスが呼び出されModelAndViewが返されるがページは描画されない)、戻り処理(ページは描画された)を実装します

preHandleではエンコード、セキュリティ制御等が可能です

postHandle では、ModelAndView を変更する機会があります。

afterCompletion では、ex が null かどうかに基づいて例外が発生したかどうかを判断し、ログに記録できます。

パラメータ内のオブジェクト ハンドラは次のインターセプタです。

インターセプターの使用方法?

インターセプターをカスタマイズするには、HandlerInterceptor インターフェースを実装する必要があります:

Java コード

public class MyInteceptor implements HandlerInterceptor {   
  略。。。 
}

Spring MVC には完全なインターセプターがないため、前後のすべてのリクエストをインターセプトすることはできません。

Spring MVC のインターセプターは HandlerMapping レベルにあり、複数の HandlerMapping が存在する可能性があり、各 HandlerMapping は独自のインターセプターを持つことができます。

HandlerMappingインターフェースの実装クラスをOrder値に従って小さいものから大きいものまで順番に実行すると、先に返されたものが終了となり、後続のHandlerMappingは消滅せず、この処理は完了します。次のプロセスに進むだけです。

インターセプターはいつ実行されますか? リクエストが HandlerMapping に渡されると、HandlerMapping はまずリクエストを処理するプロセッサを探し、それが見つかった場合はインターセプタを実行し、それをターゲット プロセッサに渡します。

ハンドラーが見つからない場合、このインターセプターは実行されません。

Spring MVC 設定ファイルには 3 つの方法があります:

オプション 1、(近似) 合計インターセプタ、すべての URL をインターセプト

Java コード

  <mvc:interceptors> 
  <bean class="com.app.mvc.MyInteceptor" /> 
</mvc:interceptors>

なぜ「近似」と呼ばれるのか, before そうは言っても、Spring には完全なインターセプターがありません。

7e1c76f056e5a23401b3d31dc10adfa0 は、HandlerMapping ごとにインターセプターを挿入します。プロセッサを見つけることができる HandlerMapping が常に存在し、最大でも 1 つのプロセッサしか見つからないため、このインターセプタは常に実行されます。完全なインターセプターとして機能します。

REST スタイルの URL の場合、静的リソースもインターセプトされます。

7e1c76f056e5a23401b3d31dc10adfa0会为每一个HandlerMapping,注入一个拦截器。总有一个HandlerMapping是可以找到处理器的,最多也只找到一个处理器,所以这个拦截器总会被执行的。起到了总拦截器的作用。

如果是REST风格的URL,静态资源也会被拦截。

方案二, (近似) 总拦截器, 拦截匹配的URL。

Xml代码  


<mvc:interceptors >  
 <mvc:interceptor>  
    <mvc:mapping path="/user/*" /> <!-- /user/* -->  
    <bean class="com.mvc.MyInteceptor"></bean>  
  </mvc:interceptor>  
</mvc:interceptors>

就是比 方案一多了一个URL匹配。

如果是REST风格的URL,静态资源也会被拦截。

方案三,HandlerMappint上的拦截器。

如果是REST风格的URL,静态资源就不会被拦截。因为我们精准的注入了拦截器。

Xml代码  


<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">    
 <property name="interceptors">    
   <list>    
     <bean class="com.mvc.MyInteceptor"></bean>   
   </list>    
 </property>    
</bean>

如果使用了463d7d566f84e66ad507872587b9c14c, 它会自动注册DefaultAnnotationHandlerMapping 与AnnotationMethodHandlerAdapter 这两个bean,所以就没有机会再给它注入interceptors属性,就无法指定拦截器。

当然我们可以通过人工配置上面的两个Bean,不使用 463d7d566f84e66ad507872587b9c14c,就可以 给interceptors属性 注入拦截器了。

其实我也不建议使用 463d7d566f84e66ad507872587b9c14c,而建议手动写详细的配置文件,来替代 463d7d566f84e66ad507872587b9c14c,这就控制力就强了。

如何替换 463d7d566f84e66ad507872587b9c14c?他到底做了什么工作?

一句 463d7d566f84e66ad507872587b9c14c

オプション 2、(おおよその) トータルインターセプターは、一致する URL をインターセプトします。

Xml コード


 <!-- 注解请求映射 --> 
  <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">     
  <property name="interceptors"> 
    <list>  
      <ref bean="logNDCInteceptor"/>  <!-- 日志拦截器,这是你自定义的拦截器 --> 
      <ref bean="myRequestHelperInteceptor"/>  <!-- RequestHelper拦截器,这是你自定义的拦截器-->  
      <ref bean="myPermissionsInteceptor"/> <!-- 权限拦截器,这是你自定义的拦截器-->  
      <ref bean="myUserInfoInteceptor"/> <!-- 用户信息拦截器,这是你自定义的拦截器-->  
    </list>     
  </property>     
</bean>   
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
  <property name="messageConverters">  
    <list>  
      <ref bean="byteArray_hmc" />  
      <ref bean="string_hmc" />  
      <ref bean="resource_hmc" />  
      <ref bean="source_hmc" />  
      <ref bean="xmlAwareForm_hmc" />  
      <ref bean="jaxb2RootElement_hmc" />  
      <ref bean="jackson_hmc" />  
    </list>  
  </property>  
</bean>  
<bean id="byteArray_hmc" class="org.springframework.http.converter.ByteArrayHttpMessageConverter" /><!-- 处理.. --> 
<bean id="string_hmc" class="org.springframework.http.converter.StringHttpMessageConverter" /><!-- 处理.. --> 
<bean id="resource_hmc" class="org.springframework.http.converter.ResourceHttpMessageConverter" /><!-- 处理.. --> 
<bean id="source_hmc" class="org.springframework.http.converter.xml.SourceHttpMessageConverter" /><!-- 处理.. --> 
<bean id="xmlAwareForm_hmc" class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter" /><!-- 处理.. --> 
<bean id="jaxb2RootElement_hmc" class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter" /><!-- 处理.. --> 
<bean id="jackson_hmc" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" /><!-- 处理json-->

は、オプション 1 よりも URL の一致が 1 つ多くなります。

🎜REST スタイルの URL の場合、静的リソースもインターセプトされます。 🎜🎜🎜オプション 3、HandlerMappint のインターセプター。 🎜🎜REST スタイルの URL の場合、静的リソースはインターセプトされません。インターセプターを正確に噴射したからです。 🎜🎜Xml コード 🎜🎜🎜🎜rrreee🎜 463d7d566f84e66ad507872587b9c14c, を使用すると、DefaultAnnotationHandlerMapping と AnnotationMethodHandlerAdapter の 2 つの Bean が自動的に登録されるため、それを与える機会はありません。再度 interceptors 属性を注入することにより、インターセプターを指定することはできません。 🎜🎜 もちろん、463d7d566f84e66ad507872587b9c14c を使用せずに上記 2 つの Bean を手動で設定し、インターセプター属性にインターセプターを挿入することもできます。 🎜🎜🎜実際、463d7d566f84e66ad507872587b9c14c の使用はお勧めしませんが、<mvc:annotation-driven / の代わりに詳細な設定ファイルを手動で記述することをお勧めします。 &gt ; を使用すると、より強力な制御が可能になります。 🎜🎜 <annotation-driven></annotation-driven> を置き換える方法は?彼は一体何をしたのでしょうか? 🎜🎜 1 つの文 463d7d566f84e66ad507872587b9c14c は、実際には次の作業を行います: (独自に定義したインターセプターの追加を除く)​​ 🎜🎜 これらを理解した後、Spring3 MVC を制御できるようになります。これはより強力です。 、どこにでも変更できます。 🎜🎜Xml コード🎜🎜🎜🎜🎜rrreee

以上がSpring MVC インターセプターの詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。