SpringMVC之拦截器

一. 前言

最擅长使用拦截器框架就是Struts2,因为Struts2的几乎所有的功能都是靠Struts2的拦截器完成的。SpringMVC里面也有定义一些拦截器,完成一些功能,比如进行国际化操作时的本地化拦截器。

SPringMVC的拦截器会对请求进行拦截,用户也可以自定义拦截器来实现特定的功能,SpringMVC中提供了一个拦截器的接口:HandlerInterceptor,所有的拦截器都必须实现这个接口:

  • preHandle():在执行处理器的目标方法之前执行,可以对用户的请求进行处理。
  • postHandle() : 这个方法在执行处理器的目标方法之后,渲染视图之前执行,可以对请求的响应进行处理。
  • afterCompletion():这个方法是在执行目标方法和渲染视图之后执行,这个方法可以进行请求资源的清理。
二. 自定义拦截器

① 编写拦截器

public class Interceptor01 implements HandlerInterceptor {
/**
 * afterCompletion 这个方法是在执行目标方法和渲染视图之后执行,这个方法可以进行请求资源的清理。
 */
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
		throws Exception {
	System.out.println("afterCompletion01......");
}

/**
 * postHandle  这个方法在执行处理器的目标方法之后,渲染视图之前执行,可以对请求的响应进行处理。
 */
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
		throws Exception {
	System.out.println("postHandle01......");
}

/**
 * preHandle : 在执行处理器的目标方法之前执行,可以对用户的请求进行处理
 * 				该方法的返回值如果为false,表示请求不再向下执行
 * 				反之,请求继续向下执行
 */
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
	System.out.println("preHandle01......");
	return true;
}
}

② 拦截器配置

<mvc:interceptors>
	  	<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean>
	  	<bean class="com.nhkj.interceptor.Interceptor01"></bean>
	  	</mvc:interceptors>
三. 拦截器的执行顺序

一个拦截器的执行顺序:

如果有两个拦截器且preHandle方法的返回值都是true时,拦截器的执行顺序是怎样的呢?

如果两个拦截器的中的第一个拦截器preHandle方法的返回值为false,第二个拦截器的preHandle方法返回值为true时,拦截器的执行顺序是怎样的呢?

如果两个拦截器的中的第一个拦截器preHandle方法的返回值为true,第二个拦截器的preHandle方法返回值为false时,拦截器的执行顺序是怎样的呢?

四. 拦截器的配置
<mvc:interceptors>
	  	<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor"></bean>
	  	<bean class="com.nhkj.interceptor.Interceptor01"></bean>
	  	<bean class="com.nhkj.interceptor.Interceptor02"></bean>
	  </mvc:interceptors>

以上的配置,表示所有经过DispatcherServlet的请求都会执行配置的三个拦截器,但是实际情况可能是,这个拦截器只对特定的请求才进行拦截。

  <!-- 表示处理特定请求地址的拦截器 -->
	    <mvc:interceptor>
	  		<mvc:mapping path="/testLocale"/>
	  	<bean class="com.nhkj.interceptor.Interceptor02"></bean>
	  	</mvc:interceptor>
	  	
  <!-- 拦截器要排除特定请求的拦截 -->
  	<mvc:interceptor>
  		<mvc:mapping path="/*"/>
  		<mvc:exclude-mapping path="/testLocale"/>
  		<bean class="com.nhkj.interceptor.Interceptor02"></bean>
  	</mvc:interceptor>
  </mvc:interceptors>
小结
  • 自定义拦截器需要实现HandlerInterceptor接口,并复写它的三个方法(preHandle,postHandle,afterCompletion)
  • 熟系拦截器的执行顺序有助于理解SpringMVC的执行流程
  • 对于拦截器的配置,通常是对特定请求进行拦截
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值