MVC的拦截器
经本人在Spring mvc中对方案1和方案2的测试表明,并没有拦截静态资源,所以可以放心使用方案1和方案2,方案3可以放弃,并且可以放心使用
方案一,(近似)总拦截器,拦截所有url
<mvc:interceptors> <bean class="com.app.mvc.MyInteceptor" /> mvc:interceptors>
为什么叫“近似”,前面说了,Spring没有总的拦截器。
如果是REST风格的URL,静态资源也会被拦截。(在4.0上测试并未有此问题)
方案二, (近似) 总拦截器, 拦截匹配的URL。
<mvc:interceptors > <mvc:interceptor> <mvc:mapping path="/user/*" /> <bean class="com.mvc.MyInteceptor">bean> mvc:interceptor> mvc:interceptors>
就是比 方案一多了一个URL匹配。
如果是REST风格的URL,静态资源也会被拦截。(在4.0上测试并未有此问题)
方案三,HandlerMappint上的拦截器。
如果是REST风格的URL,静态资源就不会被拦截。因为我们精准的注入了拦截器
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> <property name="interceptors"> <list> <bean class="com.mvc.MyInteceptor">bean> list> property> bean>
如果使用了
当然我们可以通过人工配置上面的两个Bean,不使用
到底帮我们做了啥
一句
我们了解这些之后,对Spring3 MVC的控制力就更强大了,想改哪就改哪里。
spring 3.0.x是下面的配置
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> <property name="interceptors"> <list> <ref bean="logNDCInteceptor"/> 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" />
转载:http://elf8848.iteye.com/blog/875830
spring 3.1 later:
Spring 3.0.x中使用了annotation-driven后,缺省使用DefaultAnnotationHandlerMapping 来注册handler method和request的mapping关系。
AnnotationMethodHandlerAdapter来在实际调用handlermethod前对其参数进行处理。
并在dispatcherServlet中,当用户未注册自定义的ExceptionResolver时,注册AnnotationMethodHandlerExceptionResolver来对使用@ExceptionHandler标注的异常处理函数进行解析处理(这也导致当用户注册了自定义的exeptionResolver时将可能导致无法处理@ExceptionHandler)。
在spring mvc 3.1中,对应变更为
DefaultAnnotationHandlerMapping -> org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
AnnotationMethodHandlerAdapter -> org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
AnnotationMethodHandlerExceptionResolver -> ExceptionHandlerExceptionResolver
以上都在使用了annotation-driven后自动注册。
而且对应分别提供了AbstractHandlerMethodMapping , AbstractHandlerMethodAdapter和 AbstractHandlerMethodExceptionResolver以便于让用户更方便的实现自定义的实现类
的可选配置
<mvc:annotation-driven message-codes-resolver ="bean ref" validator="" conversion-service=""> <mvc:return-value-handlers> <bean>bean> mvc:return-value-handlers> <mvc:argument-resolvers> mvc:argument-resolvers> <mvc:message-converters> mvc:message-converters>[/color] mvc:annotation-driven>
具体可以参见:http://starscream.iteye.com/blog/1098880
Spring拦截器的定义:
Spring为我们提供了:
org.springframework.web.servlet.HandlerInterceptor接口,
org.springframework.web.servlet.handler.HandlerInterceptorAdapter适配器,
实现这个接口或继承此类,可以非常方便的实现自己的拦截器。
有以下三个方法:
//Action之前执行: public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler); //如果返回false则中断请求 //生成视图之前执行 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView); //最后执行,可用于释放资源 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)