SpringBoot系列(十)拦截器的配置与使用

SpringBoot系列(十)拦截器的配置与使用

目录

1. 拦截器介绍2.自定义拦截器3.拦截器注入适配器4.controller测试5. 测试6. 扩展内容:拦截器链7. 总结

1. 拦截器介绍

拦截器是在servlet执行之前执行的程序(这里就是controller代码执行之前),它主要是用于拦截用户请求并作相应的处理,比如说可以判断用户是否登录,做相关的日志记录,也可以做权限管理。

SpringBoot中的拦截器实现和spring mvc 中是一样的,它的大致流程是,先自己定义一个拦截器类,并将这个类实现一个HandlerInterceptor类,或者是继承HandlerInterceptorAdapter,都可以实现拦截器的定义。然后将自己定义的拦截器注入到适配器中,也有两种方式,一种是实现WebMvcConfigurer接口,一种是继承WebMvcConfigurerAdapter。下面我们来看看如何完成

2.自定义拦截器

直接上代码,再进行一些代码讲解。

代码语言:javascript代码运行次数:0运行复制public class MyInterceptor implements HandlerInterceptor {

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {

System.out.println("进入拦截器了");

//中间写逻辑代码,比如判断是否登录成功,失败则返回false

return true;

}

@Override

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {

//

System.out.println("controller 执行完了");

}

@Override

public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {

System.out.println("我获取到了一个返回的结果:"+response);

System.out.println("请求结束了");

}

} 代码说明:

自定义的拦截器可以实现HandlerInterceptor接口,也可以继承HandlerInterceptorAdapter类。重写三个方法,当然也可以只实现一个最重要的preHandle方法。preHandle方法:此方法会在进入controller之前执行,返回Boolean值决定是否执行后续操作。postHandle方法:此方法将在controller执行之后执行,但是视图还没有解析,可向ModelAndView中添加数据(前后端不分离的)。afterCompletion方法:该方法会在整个请求结束(请求结束,但是并未返回结果给客户端)之后执行, 可获取响应数据及异常信息。

3.拦截器注入适配器

代码语言:javascript代码运行次数:0运行复制@Configuration

public class InterceptorConfig implements WebMvcConfigurer {

@Override

public void addInterceptors(InterceptorRegistry registry) {

registry.addInterceptor(new MyInterceptor())

.addPathPatterns("/**")//拦截所有的路径

.excludePathPatterns("/LoginController/login");

}

} 代码说明:

通过实现WebMvcConfigurer接口可以自定义一个适配器,也可以通过继承WebMvcConfigurerAdapter来定义适配器,建议使用第一种,第二种已经是过时的方法了。重写addInterceptors方法,addInterceptor方法是将拦截器注入到适配器中。addPathPatterns方法是设置一个需要拦截的路径,可以是多个字符串或者是直接传入一个数组。excludePathPatterns是配置不需要拦截的路径。需要加上configuration注解说明这是一个配置类,在项目启动的时候自动执行。

4.controller测试

先创建一个登陆的测试,这个接口是不会拦截的。

代码语言:javascript代码运行次数:0运行复制@RestController

@RequestMapping("LoginController")

public class Login {

@RequestMapping("/login")

public String login(){

System.out.println("controller开始执行");

return "login success";

}

} 创建一个拦截的controller

代码语言:javascript代码运行次数:0运行复制@RestController

@RequestMapping("/hello")

public class HelloController {

@RequestMapping("/hello")

public String hello(){

System.out.println("经过拦截的controller代码执行完毕");

return "hello";

}

}5. 测试

测试未拦截的接口,浏览器输入:localhost:8097/LoginController/login,查看控制台输出情况。

控制台只输出了未拦截接口内的代码,说明这个接口是未拦截的。浏览器的显示就不管了。其实一般是拦截登录接口,这里就将它放开了,以供测试。

测试拦截的接口,浏览器输入:localhost:8097/hello/hello,查看控制台输出情况。

可以看到,首先是进入了拦截器,通过拦截器之后,进入了controller中的方法,执行完controller的代码之后就进入了自定义拦截器中的postHandle方法,最后进入afterCompletion方法,并获取到了一个response对象。

6. 扩展内容:拦截器链

我们可以定义多个拦截器组成一个拦截器链。我们可以在适配器中注入多个拦截器。多加一行代码就行了。

按照拦截器注入的顺序,拦截器的执行顺序应该是以下顺序:拦截器1,拦截器2,拦截器2处理,拦截器1处理,拦截器2结束,拦截器1结束。对应三个过程的方法就是preHandle,postHandle,afterCompletion。

7. 总结

本文从拦截器的自定义到自定义适配器,然后将拦截器注入适配器,再到编写测试代码。准备工作完成之后就进行一个测试拦截器是否成功,最后扩展出拦截器链的一些内容。

end

相关典藏

世界杯十大发型:C罗内马尔巴神PK 四大蓬蓬头(图)
365betribo88

世界杯十大发型:C罗内马尔巴神PK 四大蓬蓬头(图)

📅 06-28 👁️‍🗨️ 2831
为什么手机没插耳机却是耳机模式
365bet大陆华人的网站

为什么手机没插耳机却是耳机模式

📅 07-17 👁️‍🗨️ 1170
DNF探索分数怎么获取
365bet大陆华人的网站

DNF探索分数怎么获取

📅 08-14 👁️‍🗨️ 4689