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

拦截器会在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()清理方法。

你可能感兴趣的:(spring,boot)