1. 自定义拦截器
Spring-boot中的拦截器通过实现HandlerInerceptor中的方法来定义,其中包含三个方法:
preHandle:请求执行前执行
postHandle:请求结束执行
afterCompletion:视图渲染完成后执行
创建自定义拦截器类TestInterceptor.java
TestInterceptor.java
package com.seasky.servicesitespring.interceptor;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestInterceptor implements HandlerInterceptor {
private static final Logger logger = LogManager.getLogger();
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//这里在请求执行前获取token
String token = request.getHeader("Authorization");
logger.info("TestInterceptor preHandle token: " + token);
if(token == null || token.isEmpty()) {
return false;//返回false表示被拦截,后续请求不在执行
}
return true;//返回true表示通过,继续执行后续拦截器,如果是最后一个拦截器,则执行controller
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
logger.info("TestInterceptor postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
logger.info("TestInterceptor afterCompletion");
}
}
2. 注册拦截器
Spring-boot中通过实现接口WebMvcConfigurer中的addInterceptors方法注册自定义的拦截器。
需要注意不要使用WebMvcConfigurerAdapter,该方法已经被官方标注过时。
创建拦截器注册类InterceptorConfig.java
InterceptorConfig.java
package com.seasky.servicesitespring.config;
import com.seasky.servicesitespring.interceptor.TestInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
//使用Configuration注解,使spring-boot启动时可以自动扫描
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
/**
* 注册拦截器方法
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
//添加自定义的拦截器,并设置拦截路径规则
registry.addInterceptor(new TestInterceptor()).addPathPatterns("/**");
}
}
之后运行程序,调用controller时会发现拦截器已经生效,命令行中可以看到日志输出。