首先通過實現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,excludePathPatterns排除靜態文件攔截
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 用戶排除攔截
// excludePathPatterns排除靜態文件攔截
registry.addInterceptor(new BaseHandlerInterceptor()).addPathPatterns("/**").excludePathPatterns("/resources/**");
super.addInterceptors(registry);
}
}