spring中攔截器主要分兩種,一個是HandlerInterceptor,一個是MethodInterceptorjava
1、HandlerInterceptorweb
HandlerInterceptor是springMVC項目中的攔截器,它攔截的目標是請求的地址,比MethodInterceptor先執行。spring
一、建立咱們本身的攔截器類並實現 HandlerInterceptor 接口或繼承HandlerInterceptorAdapter。
二、建立一個Java類繼承WebMvcConfigurerAdapter,並重寫 addInterceptors 方法。
三、實例化咱們自定義的攔截器,而後將對像手動添加到攔截器鏈中(在addInterceptors方法中添加)。後端
package com.qicheshetuan.backend.web.interceptor; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Created by 15117 on 2018/4/27. */ public class TestInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("在控制器執行前調用 "); Boolean flag = true; if(flag){ System.out.println(request.getMethod()); return true; }else{ System.out.println(request.getMethod()); return false; } } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("在後端控制器執行後調用 "); super.postHandle(request, response, handler, modelAndView); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("整個請求執行完成後調用 "); super.afterCompletion(request, response, handler, ex); } }
package com.qicheshetuan.backend.web.interceptor; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; /** * Created by 15117 on 2018/4/27. */ @Configuration public class InterceptorConfig extends WebMvcConfigurerAdapter { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new TestInterceptor()).addPathPatterns("/**"); super.addInterceptors(registry); } }
2、MethodInterceptoride
MethodInterceptor是AOP項目中的攔截器,它攔截的目標是方法,即便不是controller中的方法。實現MethodInterceptor攔截器大體也分爲兩種,一種是實現MethodInterceptor接口,另外一種利用AspectJ的註解或配置。post
基於註解的AspectJ方式spa
package com.qicheshetuan.backend.web.interceptor; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.springframework.stereotype.Component; /** * Created by 15117 on 2018/4/27. */ @Component @Aspect public class AspectJInterceptor { @Around("execution(* com.qicheshetuan.backend.web.controller.AutoCommunityController.*(..))") public Object around(ProceedingJoinPoint pjp) throws Throwable { System.out.println("方法執行前"); Object proceed = pjp.proceed(); System.out.println("方法執行後"); return proceed; } }
package com.qicheshetuan.backend.web.interceptor; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; /** * Created by 15117 on 2018/4/27. */ @Component @Aspect public class AspectJInterceptor { @Pointcut("execution(* com.qicheshetuan.backend.web.controller..*.*(..))") public void execMethod(){ } @Before("execMethod()") public void beforeMethod(JoinPoint joinPoint){ System.out.println("方法前執行"); System.out.println(joinPoint.getSignature().getName()); } }
備註:code
近日,發現Spring 5.0 之後WebMvcConfigurerAdapter會過期,新實現blog
(一)繼承
@Configuration
public class TestConfig implements WebMvcConfigurer {
. . .
}
(2、推薦)
@Configuration
public class TestConfig extends WebMvcConfigurationSupport {
. . .
}
因爲spring boot 2.x依賴的spring 5.x版本,使用spring 5.x時,靜態資源也會執行自定義的攔截器
全部致使靜態資源不可訪問的問題
解決方法:
在添加自定義攔截器是,過濾掉靜態資源路徑