拦截器会在controller层响应前端响应之前先拦截请求,对请求做处理,然后再由controller层进行响应,就是在前端和后台响应之间加了一次拦截请求。实现拦截器需要实现HandlerInterceptor接口,并且实现接口中的preHandle、postHandle和afterCompletion三个方法。当拦截器拦截到请求后,
- preHandle:在controller层响应之前执行;
- postHandle:在contrller层响应请求后执行,但是在页面渲染之前执行;
- afterCompletion:一般在页面渲染之后调用,用于清理资源
实现拦截器后并不会自动发挥功能,需要写一个配置类,把拦截器加进来。配置类要继承WebMvcConfigurerAdapter抽象类,并重写addInterceptors方法,在addInterceptors方法中加入拦截器。
示例如下
1、建立一个MyHandlerInterceptor拦截器
package com.lzj.spring.boot.config;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class MyHandlerInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("-----preHandle-----");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("-----postHandle-----");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println("-----afterCompletion-----");
}
}
2、建立MyWebMvcConfigAdpter拦截器配置类,用于配置拦截器
package com.lzj.spring.boot.config;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
/*也可以用@Configuration注解标识 */
@SpringBootConfiguration
public class MyWebMvcConfigAdpter extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
/*把定义的拦截器加入到容器中*/
registry.addInterceptor(new MyHandlerInterceptor());
}
}
3、定义controller层,用于响应前端请求
@RestController
public class MyController {
@RequestMapping("/hello")
public String hello(){
System.out.println("-----hello()-----");
return "hello world";
}
}
4、spring boot的启动类
package com.lzj.spring.boot.start;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/*用scanBasePackages定义扫描容器的范围,因为启动类和监听器的配置类不在一个包下面,所以需要制定扫描范围,否则找不到*/
@SpringBootApplication(scanBasePackages="com.lzj.spring.boot.config")
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
运行启动类,浏览器中输入http://localhost:8080/hello请求后,Console中输出内容如下:
-----preHandle-----
-----hello()-----
-----postHandle-----
-----afterCompletion-----
从输出结果可以看出,先执行的拦截器的preHandle()方法,然后执行的Controller层的hello()的方法,然后有执行的拦截器的postHandle()的方法,最后执行的拦截器的afterCompletion()清理方法。