10.9、spring boot的web应用——拦截器的应用

来源:互联网 发布:js获取当前城市名称 编辑:程序博客网 时间:2024/05/21 22:33

拦截器会在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注解标识 */@SpringBootConfigurationpublic class MyWebMvcConfigAdpter extends WebMvcConfigurerAdapter {    @Override    public void addInterceptors(InterceptorRegistry registry) {        /*把定义的拦截器加入到容器中*/        registry.addInterceptor(new MyHandlerInterceptor());    }}

3、定义controller层,用于响应前端请求

@RestControllerpublic 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()清理方法。

阅读全文
0 0