欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringMVC之拦截器

程序员文章站 2022-07-09 18:10:18
...

一. 前言

最擅长使用拦截器框架就是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>

三. 拦截器的执行顺序

一个拦截器的执行顺序:

SpringMVC之拦截器

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

SpringMVC之拦截器

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

SpringMVC之拦截器

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

SpringMVC之拦截器

四. 拦截器的配置

<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的执行流程
  • 对于拦截器的配置,通常是对特定请求进行拦截