Filter 過濾器
1、編寫過濾器TestFilter 繼承javax.servlet.Filter
@Component
public class TestFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("加載攔截器");
}
/**
* 過濾后的處理操作
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("開始攔截");
Date startTime = new Date();
//對(duì)請(qǐng)求進(jìn)行處理
chain.doFilter(request,response);
Date endTime = new Date();
System.out.println("結(jié)束攔截");
System.out.println("總用時(shí)" + (endTime.getTime() - startTime.getTime()));
}
@Override
public void destroy() {
System.out.println("銷毀攔截器");
}
}
注釋:@Component注解把我們寫好的Filter注入到Spring容器中
2、編寫Controller,用于測(cè)試Filter
@RestController //spring boot注解 @RestController = @Controller + @ResponseBody
@RequestMapping("/test") //controller請(qǐng)求路徑
public class TestController {
@GetMapping( "get_user")
public SR getUser() {
System.out.println("調(diào)用getUser服務(wù)");
User user = User.builder()
.age(16)
// .name("張三")
.sex("男")
.birthday(new Date())
.build();
return SR.ok(user);
}
}
運(yùn)行服務(wù)測(cè)試,訪問剛才寫好的controller

我們的Filter已經(jīng)攔截到了請(qǐng)求。
攔截器 Interceptor
1、編寫攔截器TestInterceptor繼承HandlerInterceptor
@Component
public class TestInterceptor implements HandlerInterceptor {
/**
* 進(jìn)入controller方法之前調(diào)用
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle");
request.setAttribute("startTime",System.currentTimeMillis());
return true;
}
/**
* controller方法結(jié)束之后調(diào)用如果有controller方法有異常則不會(huì)調(diào)用
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandler");
System.out.println(System.currentTimeMillis() - (Long)request.getAttribute("startTime")+ "秒");
}
/**
* controller方法之后調(diào)用
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion");
System.out.println(System.currentTimeMillis() - (Long)request.getAttribute("startTime")+ "秒");
}
}
寫完攔截器我們對(duì)他進(jìn)行注冊(cè),讓Springboot能加載到,注冊(cè)類
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private TestInterceptor testInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(testInterceptor);
}
}
啟動(dòng)服務(wù)訪問接口:

攔截器已經(jīng)成功攔截
下面進(jìn)行postHandler異常測(cè)試
在控制器里隨便拋出一個(gè)異常

結(jié)果:

postHandler沒有
在異常后面我們還會(huì)發(fā)現(xiàn)一組攔截到信息

這時(shí)候我們發(fā)現(xiàn)有postHandler,這是因?yàn)閿r截器會(huì)攔截所有的controller,包括Spring自己的controller,后面就是在出現(xiàn)異常后Spring會(huì)進(jìn)入一個(gè)ErrorController里。這時(shí)候就會(huì)被攔截了。