spring boot配置攔截器/過濾器,並指定順序及規則
阿新 • • 發佈:2018-12-25
大家推薦個靠譜的公眾號程式設計師探索之路,大家一起加油,這個公眾號已經接入圖靈 攔截器: package com.zzh.interceptor; import org.springframework.stereotype.Component; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.time.Duration; import java.time.Instant; @Component public class ControllerTimeInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { request.setAttribute("StarTime", Instant.now()); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println(((HandlerMethod)handler).getBean().getClass().getName()); System.out.println(((HandlerMethod)handler).getMethod().getName()); System.out.println("耗時-->"+Duration.between((Instant)request.getAttribute("StarTime"), Instant.now()).toMillis()); } } 過濾器
package com.zzh.filter; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; import java.time.Duration; import java.time.Instant; //註解方式 //@Component //@Order(Integer.MAX_VALUE)//順序 //@WebFilter(filterName = "ControllerTimeFilter", urlPatterns = {"/api/dept/**"})//過濾器名稱,以及過濾url public class ControllerTimeFilter implements Filter{ //初始化 @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("ControllerTimeFilter 初始化了"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { Instant start = Instant.now(); chain.doFilter(request, response); Instant end = Instant.now(); System.out.println("ControllerTimeFilter耗時"+ Duration.between(start, end).toMillis()); } @Override public void destroy() { System.out.println("ControllerTimeFilter 銷燬了"); } }
package com.zzh.filter; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException; import java.time.Duration; import java.time.Instant; //@Component //@Order(Integer.MAX_VALUE)//指定過濾器的順序 值越小越靠前 //@WebFilter(filterName = "ControllerTimeFilter2", urlPatterns = {"/**/list"}) public class ControllerTimeFilter2 implements Filter{ //初始化 @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("ControllerTimeFilter2 初始化了"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { Instant start = Instant.now(); chain.doFilter(request, response); Instant end = Instant.now(); System.out.println("ControllerTimeFilter2耗時"+ Duration.between(start, end).toMillis()); } @Override public void destroy() { System.out.println("ControllerTimeFilter 銷燬了"); } } MvcConfig
package com.zzh.config;
import com.zzh.filter.ControllerTimeFilter;
import com.zzh.filter.ControllerTimeFilter2;
import com.zzh.interceptor.ControllerTimeInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter{
@Autowired
private ControllerTimeInterceptor controllerTimeInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//配置 攔截 /list結尾的請求
// /*表示只攔截 /這一層目錄下的/list 比如 攔截/dept/list 不會攔截/api/dept/list
// /** 表示攔截 /這一層目錄下的包含子目錄的/list 比如攔截 /api/dept/list
//攔截器的順序 就是這個配置的順序
registry.addInterceptor(controllerTimeInterceptor).addPathPatterns("/**/list");
//假設這裡再配置一個 那麼 這個就會第二個執行
}
/**
* 攔截器也可以通過下面的方式配置
*/
@Bean
public FilterRegistrationBean filterRegistrationBean(){
ControllerTimeFilter controllerTimeFilter = new ControllerTimeFilter();
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(controllerTimeFilter);
//過濾的路徑 可以自己寫一個集合 放進去
registration.addUrlPatterns("/*");
//過濾器的名字
registration.setName("controllerTimeFilter");
registration.setOrder(Integer.MAX_VALUE);
return registration;
}
@Bean
public FilterRegistrationBean filterRegistrationBean2(){
ControllerTimeFilter2 controllerTimeFilter = new ControllerTimeFilter2();
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(controllerTimeFilter);
//過濾的路徑 可以自己寫一個集合 放進去
registration.addUrlPatterns("/*");
//過濾器的名字
registration.setName("controllerTimeFilter2");
registration.setOrder(Integer.MAX_VALUE-1);
return registration;
}
}
效果:耗時-->190
ControllerTimeFilter耗時196
ControllerTimeFilter2耗時196