1、实现HandlerInterceptor接口或继承HandlerInterceptorAdapter类自定义拦截器
本文采用实现HandlerInterceptor接口
import org.apache.logging.log4j.util.Strings;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截方法访问之前调用");
System.out.println(request.getRequestURI() + "被MyInterceptor拦截器拦截");
String token = request.getHeader("token");
if(Strings.isEmpty(token)){
// 如果token为空转到/api/open/unlogin接口,即模拟未登录跳转到登录接口
request.getRequestDispatcher("/api/open/unlogin").forward(request,response);
return false;
}
return true; //不拦截,放行
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("访问之后调用");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("整个流程结束之后调用");
}
}
2、配置类对添加拦截器
import com.scitech.interceptor.MyInterceptor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration //配置类加上@Configuration注解
public class WebApplicationConfig implements WebMvcConfigurer {
@Value("${open.url}") //开放性url,此处为/**/open/**
private String openUrl;
@Bean
public MyInterceptor getMyInterceptor(){
return new MyInterceptor();
}
/**
* 添加拦截器
* 对所有除了openUrl开放性接口进行拦截
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
//添加拦截器方法 添加拦截策略(路径) 放弃开放性白名单
registry.addInterceptor(getMyInterceptor()).addPathPatterns("/api/**").excludePathPatterns(openUrl);
}
}
3、对拦截器进行测试
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
public class TestController {
//调用该接口时,有token则进入该接口,没有token就跳转到/api/open/unlogin
@GetMapping("/abc")
public String hello2(){
return "不是开放性接口,需要拦截,有token时显示";
}
@GetMapping("/open/unlogin") //开放性接口,不需要拦截
public String hello3(){
return "unlogin";
}
}
调用/api/abc接口:
添加token时结果:
不加token时结果: