Spring一步到位精通 *
作者:不死鸟.亚历山大.狼崽子 时间:2022-01-03 18:31:50
1 *
* 是Spring中的概念,和过滤器类似,可以对用户请求进行拦截过滤处理。但是相对于过滤器而言, * 要的控制更加的细节, * 可以在三个地方进行执行:
可以在请求达到Controller控制器之前,通过 * 执行一段代码
也可以在控制器执行之后,通过 * 执行一段代码,此时只是Controller执行完毕视图还没有开始渲染
最后在整个请求结束的时候还可以通过 * 执行一段代码
使用 * 的方法
创建支持它的@Component类,它应该实现HandlerInterceptor接口
实现WebMVCConfigure配置器,注册到spring容器中,添加拦截路径和放行路径
* 和过滤器的区别:
* (Interceptor)类似于Servlet中的过滤器( Filter),它主要用于拦截用户请求并做相应的处理。
过滤器只能在容器初始化时被调用异常,在action的生命周期中,而 * 可以多次被调用。
过滤器可以对几乎所有的请求起作用, * 只能对action请求起作用。
过滤器不能访问action上下文、堆栈里的对象,而 * 可以访问。
过滤器是基于函数回调,而 * 不依赖与servlet容器。
过滤器不能获取IOC容器中的各个bean,而 * 可以,这点很重要,在 * 里注入一个service,可以调用业务逻辑
* 是在DispatcherServlet这个servlet中执行的,因此所有的请求最先进入Filter,最后离开Filter。其顺序如下。
Filter->Interceptor.preHandle->Handler->Interceptor.postHandle->Interceptor.afterCompletion->Filter
2 实现流程
2.1 引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
2.2 自定义 *
package com.example.demo.Interceptor;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class EasyLogControllerInterceptor implements HandlerInterceptor {
/**
* 在controller调用之前执行
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println(request.getRequestURI()+"开始执行");
return true;
}
/**
* 在controller调用中执行
*/
public void postHandle(
HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
throws Exception {
System.out.println(request.getRequestURI()+"执行中");
}
/**
* 在controller调用后执行
*/
public void afterCompletion(
HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println(request.getRequestURI()+"执行结束");
}
}
2.3 注入适配器
package com.example.demo.Interceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class IntercepterConfig implements WebMvcConfigurer {
@Autowired
private EasyLogControllerInterceptor easyLogControllerInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//addPathPatterns用于添加拦截路径
//excludePathPatterns用于添加不拦截的路径
registry.addInterceptor(easyLogControllerInterceptor).addPathPatterns("/hello");
}
//此方法用于配置静态资源路径
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("classpath:/my/");
}
}
执行结果如下:
访问hello接口时,会进入 * ,其他的接口不会进入。
3 控制器验证
多个 * 顺序
多个 * 的执行顺序和注册的顺序有关,先注册的先执行
可以通过Order方法来设置执行顺序,值越小越先执行
来源:https://blog.csdn.net/u013938578/article/details/128644332