拦截器?
拦截器(Interceptor): 用于在某个方法被访问之前进行拦截,然后在方法执行之前或之后加入某些操作,其实就是AOP的一种实现策略。它通过动态拦截Action调用的对象,允许开发者定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。另外拦截器依赖于Spring的框架,需实现Spring的HandlerInterceptor接口
拦截器的作用
拦截用户的请求并进行相应的处理,比如:判断用户是否登陆,是否在可购买时间内,记录日志信息等。
Spring Boot如何配置拦截器?
a)创建Interceptor类
package org.learn.interceptor;
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{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
System.out.println("执行了TestInterceptor的preHandle方法");
return true; //如果设置为false时,被请求时,拦截器执行到此处将不会继续操作
//如果设置为true时,请求将会继续执行后面的操作
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
System.out.println("执行了TestInterceptor的postHandle方法");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
System.out.println("执行了TestInterceptor的afterCompletion方法");
}
}
b)创建拦截器配置类
package org.learn.config;
import org.learn.interceptor.TestInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebAppConfigurer implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//註冊TestInterceptor拦截器
InterceptorRegistration registration = registry.addInterceptor(new TestInterceptor());
registration.addPathPatterns("/**"); //所有路径都被拦截
registration.excludePathPatterns("/","/error","/static/**"); //添加不拦截路径
}
}
b)创建拦截器配置类
package org.learn.config;
import org.learn.interceptor.TestInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebAppConfigurer implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//註冊TestInterceptor拦截器
InterceptorRegistration registration = registry.addInterceptor(new TestInterceptor());
registration.addPathPatterns("/**"); //所有路径都被拦截
registration.excludePathPatterns("/","/error","/static/**"); //添加不拦截路径
}
}
c)创建Controller类
package org.learn.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class TestInterceptorController {
@GetMapping("/testinterceptor")
public String testInterCep(){
System.out.println("执行了TestInterceptorController的testInterCep方法");
return "testinterceptor";
}
}
d)运行项目启动类并发送请求
从控制台输出我们可以看到结果
从输出结果中我们可以看到,发送的请求先被拦截器拦截,执行了preHandle方法,如果该方法返回结果为true则执行到我们实际请求的controller中/testinterceptor方法,然后执行拦截器的postHandle方法、afterCompletion方法。从这里大家就能看出拦截器的执行顺序了。