Spring MVC 拦截器

本文深入解析Spring框架中的拦截器机制,包括配置、运行顺序及作用流程。通过实例演示如何使用注解实现国际化、本地化与多个拦截器的串联操作。
spring 拦截器
1.firstIntercept
2.secondIntercept
配置文件
我默认用注解

<bean id="messageSource"
		class="org.springframework.context.support.ResourceBundleMessageSource">
		<!--value属性的值是你存放国际化信息的文件名的前缀,basename 表是单数 -->
		<property name="basename" value="messages"></property>
		<!-- <property name="basenames"> <list> <value>messages</value> </list> 
			</property> -->

		<property name="useCodeAsDefaultMessage" value="true" />

</bean>
<bean id="localeResolver"

		class="org.springframework.web.servlet.i18n.CookieLocaleResolver">

		<property name="defaultLocale" value="en" /><!---->默认国际化语言是英文
</bean>
<bean id="localeChangeInterceptor"

		class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">

		<property name="paramName" value="lang" />
		<!-- lang=ja_JP_ //日文 lang=zh //中文 lang=en //英文 -->
</bean>

<bean 
		class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
</bean>

<bean id="firstIntercept" class="cn.easier.interceptor.FirstIntercept"/>
<bean id="secondIntercept" class="cn.easier.interceptor.SecondIntercept"></bean>

<bean id="handlerMapping"

		class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">

		<property name="interceptors">
				<list>
					  <ref bean="localeChangeInterceptor"/>  <!--国际化拦截器-->
					  <ref bean="firstIntercept"/>
					   <ref bean="SecondIntercept"/>
				</list>
			 
		</property>
		
</bean>
运行顺序
 1、两个都返回true
如果(firstIntercept)第一个拦截器中的preHandler方法返回true
就(SecodeIntecept)执行下一个拦截器的preHandler方法也返回true,再以此类推..

firstIntercept...preHandler
SecodeIntecept...preHandler

save  //这是control里面去了,表示上面两个拦截器都返回true了

SecodeIntecept...postHandle
firstIntercept...postHandle

SecodeIntecept...afterCompletion
firstIntercept...afterCompletion

 2、第一个都返回false
firstIntercept...preHandler  //进入第一个拦截器的preHandler里面,就停止执行了,后面的拦截器都不会执行了

 3、第二个都返回false
firstIntercept...preHandler //进入第一个拦截器的preHandler里面,因为第一个拦截器返回true,进入第二个拦截器preHandler里面去了
SecodeIntecept...preHandler //进入第二个拦截器preHandler里,但是他返回false,所以停留在第二个拦截器里面了,

firstIntercept...afterCompletion  //但是他会执行第一个(firstIntercept)拦截器的afterCompletion方法

4.thirdIntercept  //第三个thirdIntercept 的preHandler方法为true时

firstIntercept...preHandler
SecodeIntecept...preHandler
thirdIntercept...preHandler

save  //这是control里面去了,表示上面两个拦截器都返回true了

SecodeIntecept...postHandle
firstIntercept...postHandle
thirdIntercept...postHandle

SecodeIntecept...afterCompletion
firstIntercept...afterCompletion
thirdIntercept...afterCompletion
//假如还有第三个
5.thirdIntercept  //第三个thirdIntercept 的preHandler方法为false时

firstIntercept...preHandler  //true
SecodeIntecept...preHandler //true
thirdIntercept...preHandler	//false  但是他会执行前一个拦截器的afterCompletion方法

SecodeIntecept...afterCompletion  //但是他会执行他前一个的前一个拦截器的afterCompletion方法
firstIntercept...afterCompletion 

 //没画图,那天画个图说说更详细  这也有个例子http://www.blogjava.net/wmcoo/articles/333752.html

Spring MVC 拦截器是一种机制,允许开发人员在请求到达控制器之前或之后执行预定的操作。它们实现了 HandlerInterceptor 接口,并可以注册到 Spring MVC 框架中,以拦截匹配特定 URL 模式的请求。拦截器通常用于执行各种任务,如身份验证、日志记录、性能监控、异常处理等[^1]。 ### 使用方法 - **请求预处理**:在请求到达控制器之前执行预处理操作,包括参数验证、用户身份验证、日志记录等。通过在 preHandle 方法中实现逻辑,可以在请求处理之前执行任何必要的操作[^1]。 - **后处理和修改响应**:在请求处理之后、视图渲染之前进行后处理。开发人员可以修改处理器的执行结果或添加额外的处理逻辑[^1]。 - **资源清理和异常处理**:拦截器的 afterCompletion 方法允许在请求处理完成后进行资源清理操作,对于释放资源、关闭连接等工作非常有用。同时,还可以在这里处理请求过程中发生的异常,以确保资源的正确释放[^1]。 - **统一处理逻辑**:可以用于实现一些统一的处理逻辑,如权限控制、日志记录、国际化等。通过将这些逻辑抽象到拦截器中,可以提高代码的重用性和可维护性,同时确保这些逻辑在整个应用程序中得到一致的应用[^1]。 ### 原理 Spring MVC 拦截器类似于 Servlet 当中的 Filter 过滤器,用于拦截用户的请求并作出相应的处理,比如通过拦截器来进行用户权限验证或者用来判断用户是否登录。它是可插拔式的设计,基于 Java 反射机制实现的请求处理增强技术,本质是 AOP 面向切面编程思想的具体实现。其实现完美体现了责任链模式的设计思想,在 HandlerExecutionChain 中定义了拦截器链的执行逻辑,包括 preHandle、postHandle 等方法的调用顺序和处理逻辑[^2][^5]。 ### 配置 在 SpringMVC 核心配置文件中配置拦截器的示例如下: ```xml <!-- 配置拦截器 --> <mvc:interceptors> <mvc:interceptor> <!-- 配置拦截器的作用路径 --> <mvc:mapping path="/**"/> <!-- 拦截器对象 --> <bean class="com.itbaizhan.interceptor.MyInterceptor"/> </mvc:interceptor> </mvc:interceptors> ``` 上述代码中,`<mvc:mapping path="/**"/>` 表示拦截所有请求,`<bean class="com.itbaizhan.interceptor.MyInterceptor"/>` 表示使用 `com.itbaizhan.interceptor.MyInterceptor` 作为拦截器对象[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值