1. 程式人生 > >springboot專案搭建之攔截器

springboot專案搭建之攔截器

首先通過實現HandlerInterceptor介面來建立一個攔截器類

這個介面一共有三個方法,preHandle是請求到controller之前執行的,只有返回true時請求才會繼續進行

postHandle是返回modelAndView之前執行的,但是隻有preHandle方法返回true後經過controller返回時才會執行,否則返回false則不會執行,afterCompletion是請求結束後才執行,同樣需要preHandle返回true,該方法通常用於統一的日誌處理,異常處理,資源清理等工作

package org.wcy.config;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

/**
 * <p>Title : BaseHandlerInterceptor</p>
 * <p>Description : 系統最高許可權攔截器</p>
 * <p>DevelopTools : Eclipse_x64_v4.8.0</p>
 * <p>DevelopSystem : Windows 10</p>
 * <p>Company : org.wangchenyang</p>
 * @author : wangChenYang
 * @date : 2018年11月25日 下午12:09:05
 * @version : 12.0.0
 */
public class BaseHandlerInterceptor implements HandlerInterceptor {


	/**
	 * 進入Handler方法之前執行
	 * 
	 * @param request  HttpServletRequest
	 * @param response HttpServletResponse
	 * @param handler  handler
	 * @return true(放行) or false(攔截)
	 */
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		System.out.print("before:");
		return true;
	}

	/**
	 * 進入Handler方法之後,返回modelAndView之前執行(可以往MV裡面填充公用的ModelAndView)
	 * 
	 * @param request  HttpServletRequest
	 * @param response HttpServletResponse
	 * @param handler  handler
	 * @param mv       ModelAndView
	 */
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mv)
			throws Exception {
		System.out.print("mv 執行:");
	}

	/**
	 * 執行Handler完成後執行(統一異常處理,統一日誌處理)
	 * 
	 * @param request  HttpServletRequest
	 * @param response HttpServletResponse
	 * @param handler  handler
	 * @param e        異常資訊
	 */
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception e)
			throws Exception {
		System.out.print("after:");
	}

}

在SpringMVC中攔截器的實現可以通過配置xml檔案內的mvc:interceptor標籤來新增自定義的攔截器類,

而springboot沒有xml。這個時候就需要通過繼承WebMvcConfigurationSupport這個類來實現攔截器的添加了,

這個類就是我在上個文章內提到的用以配置靜態檔案的類,同時它也可以用以裝載自定義攔截器。

addInterceptors用於指定攔截器,addPathPatterns用於指定攔截的URL

package org.wcy.config;
 
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
 
/**
 * <p>Title : MyWebMvcConfig</p>
 * <p>Description : 自定義靜態資源對映路徑和靜態資源存放路徑</p>
 * <p>DevelopTools : Eclipse_x64_v4.7.1</p>
 * <p>DevelopSystem : Windows 10</p>
 * <p>Company : org.wcy</p>
 * @author : WangChenYang
 * @date : 2018年11月14日 下午9:07:33
 * @version : 0.0.1
 */
@Configuration
public class MyWebMvcConfig extends WebMvcConfigurationSupport {
 
	/**
	 * 新增自定義靜態資源對映路徑和靜態資源存放路徑(圖片)
	 */
	@Override
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
		System.out.println("配置靜態資源");
		registry.addResourceHandler("/resources/**").addResourceLocations("classpath:/WEB-INF/resources/");
		super.addResourceHandlers(registry);
	}
	
	/**
	 * 新增攔截器
	 * @param registry
	 */
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		// 多個攔截器組成一個攔截器鏈
		// addPathPatterns 用於新增攔截規則
		// excludePathPatterns 使用者排除攔截
		registry.addInterceptor(new BaseHandlerInterceptor()).addPathPatterns("/**");
		super.addInterceptors(registry);
	}
 
}