天天看點

Spring MVC(11)——攔截器

文章目錄

    • 如何自定義攔截器?
      • 1. 編寫攔截器類,實作 HandlerInterceptor 接口
      • 2. 在 Spring MVC 配置檔案中注冊這個攔截器
    • 攔截器的配置
    • 多個攔截器的執行順序

如何自定義攔截器?

1. 編寫攔截器類,實作 HandlerInterceptor 接口

該接口有以下3個方法:

  • preHandle():該方法在目标方法之前被調用。若傳回值為 true,則繼續調用後續的攔截器和目标方法;若傳回值為 false,則不會再調用後續的攔截器和目标方法。用途:可以考慮做權限、日志、事務等
  • postHandle():調用目标方法之後,但在渲染視圖之前。用途:可以對請求域中的屬性或視圖做出修改
  • afterCompletion():渲染視圖之後被調用。用途:釋放資源
public class FirstInterceptor implements HandlerInterceptor{

	@Override
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		System.out.println("[FirstInterceptor] preHandle");
		return true;
	} 

	@Override
	public void postHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println("[FirstInterceptor] postHandle");
	}

	@Override
	public void afterCompletion(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		System.out.println("[FirstInterceptor] afterCompletion");
	}

}
           

2. 在 Spring MVC 配置檔案中注冊這個攔截器

<mvc:interceptors>
	<bean class="com.atguigu.springmvc.interceptors.FirstInterceptor"/>
</mvc:interceptors>
           

攔截器的配置

mvc:interceptors 節點下有一個 mvc:interceptor 節點,不僅能注冊一個攔截器,還可以對攔截器進行一些配置

  • mvc:mapping:配置攔截器生效的路徑
  • mvc:exclude-mapping:配置攔截器不生效的路徑
<mvc:interceptors>
	<mvc:interceptor>
		<mvc:mapping path="/emps"/>
		<bean class="com.atguigu.springmvc.interceptors.SecondInterceptor"/>
	</mvc:interceptor>
</mvc:interceptors>
           

多個攔截器的執行順序

  • 配置順序:
<mvc:interceptors>
	<bean class="com.atguigu.springmvc.interceptors.FirstInterceptor"/>
	
	<mvc:interceptor>
		<mvc:mapping path="/emps"/>
		<bean class="com.atguigu.springmvc.interceptors.SecondInterceptor"/>
	</mvc:interceptor>
</mvc:interceptors>
           
  • 執行順序:
    Spring MVC(11)——攔截器