看一下HandlerInterceptor接口定義,關于具體的HandlerInterceptor說明大家可以看看源碼的官方doc說明,更加深入的了解這個接口,包括其一些實現(xiàn):

HandlerInterceptor接口
preHandle:controller執(zhí)行之前調用
postHandle:controller執(zhí)行之后,且頁面渲染之前調用
afterCompletion:頁面渲染之后調用,一般用于資源清理操作
看一個demo,自己寫一個攔截器實現(xiàn)HandlerInterceptor,重寫三個方法,
package com.zhihao.miao;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LogHandlerInterceptor implements HandlerInterceptor {
private Logger logger = LoggerFactory.getLogger(getClass());
//請求執(zhí)行之前調用
@Override
public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {
System.out.println("==========preHandle==========" + handler.getClass());
return true;
}
//請求之后,且頁面渲染之前調用
@Override
public void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {
String UserAgent = request.getHeader("User-Agent");
logger.info("UserAgent==="+UserAgent);
String remoteIp = request.getRemoteHost()+","+request.getRequestURI();
logger.info("remoteIp"+remoteIp);
}
//頁面渲染之后調用,一般用于資源清理操作
@Override
public void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("===========afterCompletion=========");
}
}
寫一個類,繼承WebMvcConfigurerAdapter抽象類,然后重寫addInterceptors方法,并調用registry.addInterceptor注冊攔截器并將該類加入到spring容器中,
package com.zhihao.miao;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@SpringBootConfiguration
public class WebConfiguration extends WebMvcConfigurerAdapter {
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LogHandlerInterceptor());
}
}
定義一個Controller進行測試:
package com.zhihao.miao;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
private Logger logger = LoggerFactory.getLogger(getClass());
@GetMapping("/user/home")
public String home(){
logger.info("user home");
return "user home";
}
}
啟動類啟動,
package com.zhihao.miao;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
訪問http://127.0.0.1:8080/user/home

總結:
編寫一個攔截器步驟:
- 寫一個攔截器,實現(xiàn)HandlerInterceptor接口
- 寫一個類,繼承WebMvcConfigurerAdapter抽象類,然后重寫addInterceptors方法,并調用registry.addInterceptor注冊自定義的攔截器。