Spring MVC のインターセプターは HandlerMapping レベルにあり、それぞれの HandlerMapping には独自のインターセプターが存在します。
Spring は springframework.web.servlet を提供します。 .HandlerInterceptor インターフェース、
org.springframework.web.servlet.handler.HandlerInterceptorAdapter アダプター、
このインターフェースを実装するか、このクラスを継承すると、独自のインターセプターを非常に簡単に実装できます。
アクションの前に実行:
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が返されるがページは描画されない)、戻り処理(ページは描画された)を実装します
インターセプターをカスタマイズするには、HandlerInterceptor インターフェースを実装する必要があります:
Java コードpublic class MyInteceptor implements HandlerInterceptor { 略。。。 }
Spring MVC には完全なインターセプターがないため、前後のすべてのリクエストをインターセプトすることはできません。
オプション 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
<!-- 注解请求映射 --> <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-->
463d7d566f84e66ad507872587b9c14c,
を使用すると、DefaultAnnotationHandlerMapping と AnnotationMethodHandlerAdapter の 2 つの Bean が自動的に登録されるため、それを与える機会はありません。再度 interceptors 属性を注入することにより、インターセプターを指定することはできません。 🎜🎜 もちろん、463d7d566f84e66ad507872587b9c14c を使用せずに上記 2 つの Bean を手動で設定し、インターセプター属性にインターセプターを挿入することもできます。 🎜🎜🎜実際、463d7d566f84e66ad507872587b9c14c
の使用はお勧めしませんが、<mvc:annotation-driven / の代わりに詳細な設定ファイルを手動で記述することをお勧めします。 > ;
を使用すると、より強力な制御が可能になります。 🎜🎜 <annotation-driven></annotation-driven>
を置き換える方法は?彼は一体何をしたのでしょうか? 🎜🎜 1 つの文 463d7d566f84e66ad507872587b9c14c
は、実際には次の作業を行います: (独自に定義したインターセプターの追加を除く) 🎜🎜 これらを理解した後、Spring3 MVC を制御できるようになります。これはより強力です。 、どこにでも変更できます。 🎜🎜Xml コード🎜🎜🎜🎜🎜rrreee以上がSpring MVC インターセプターの詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。