/** * 攔截器 * * 和過濾器不同的是攔截器可以知道當前的用戶請求的是哪個控制器的哪個方法 * 單單使用@Component是不能讓攔截器起作用的,還需要額外的配置 * (在WebConfig里面配置 1、繼承WebMvcConfigurerAdapter 2、在addInterceptors里面添加攔截器) * * 其實我們知道了是哪個控制器的哪個方法被調用也是沒用的,因為我們不知道用戶請求過來的參數是什么
* 如果需要知道請求參數的話需要用到切片Aspect(也就是Spring AOP) */ @Component public class DemoInterceptor implements HandlerInterceptor { /** * 控制器方法被調用之前 * @param httpServletRequest * @param httpServletResponse * @param o * @return 返回false就不會調用后面的方法了, * @throws Exception */ @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { System.out.println("preHandle"); //獲取控制器的名字 System.out.println(((HandlerMethod) o).getBean().getClass().getName()); //獲取方法名 System.out.println(((HandlerMethod) o).getMethod().getName()); return true; } /** * 控制器的方法處理之后 如果出現異常則不調用 * @param httpServletRequest * @param httpServletResponse * @param o * @param modelAndView * @throws Exception */ @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { System.out.println("postHandle"); } /** * 出不出現異常都會調用 * @param httpServletRequest * @param httpServletResponse * @param o * @param e * @throws Exception */ @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { System.out.println("afterCompletion"); System.out.println("ex is "+e); } }
WebConfig配置類
@Configuration public class WebConfig extends WebMvcConfigurerAdapter{ @Autowired private DemoInterceptor demoInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { /** * 添加攔截器 */ registry.addInterceptor(demoInterceptor);
} }