第一步:创建一个实现 HandlerInterceptor 的类
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class WebInterceptor implements HandlerInterceptor {
/**
* preHandle 表示方法请求前的处理,若其返回值为FALSE,就中断请求目标方法了,只有返回值为TRUE时才继续执行方法内容
* @param httpServletRequest
* @param httpServletResponse
* @param o
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
String token = httpServletRequest.getHeader("token");
//token验证
if(!"8BC0BAE5859CDA31D212022721B3C00E".equals(token)){
System.out.println("token验证失败");
return false;
}
System.out.println("token验证成功");
return true;
}
/**
* postHandle 是在目标方法执行完之后执行的
* @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(" WebInterceptor | postHandle ================");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println(" WebInterceptor | afterCompletion ================");
}
}
此类主要实现HandlerInterceptor类的三个方法
注:preHandle方法在调用方法前被调用,此时就可以对此方法进行重写,完成token校验操作
第二步:注册拦截器。创建一个配置类并继承 WebMvcConfigurerAdapter。重写 addInterceptors 方法
import com.lxj.thread.Interceptor.WebInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
/**
* 拦截器配置
* @param registry
*/
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new WebInterceptor()).addPathPatterns("/user/**").excludePathPatterns("/exclude/**");
}
/**
* 跨域支持配置
* @param registry
*/
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowCredentials(true).allowedOrigins("*").allowedMethods("GET", "PUT", "DELETE", "POST", "OPTIONS").maxAge(3600);
}
/**
* 参数解析配置
* @param resolvers
*/
// @Override
// public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
// resolvers.add(loginUserHandlerMethodArgumentResolver);
// }
}
说明: WebConfig类继承WebMvcConfigurerAdapter类 实现的addInterceptors类下的addPathPatterns,excludePathPatterns方法。
注:addPathPatterns 方法是添加需要进行拦截的方法,excludePathPatterns方法是添加不需要进行拦截的方法。
第三步:添加controller方法
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/interceptor")
public String interceptor(ModelMap model){
model.addAttribute("test",123456);
System.out.println("+++++++++++++++ TestControllerInterceptor +++++++++++++ ");
return "interceptor";
}
说明:UserController 中的方法interceptor在请求是 先回去WebInterceptor类中的preHandle方法,在preHandle方法中进行token校验,执行完通过后才会进入interceptor方法,然后依次会到postHandle,afterCompletion方法进行操作最后结束。(猿友们可以自己开启debug模式自己走一遍看看中间的原理,这样更清楚)。
到此一个简易的拦截器就实现了