拦截器(Interceptor):是一种动态拦截方法调用的机制,在SpringMVC中动态拦截控制器方法的执行(类似有保安拦截检查,正常才通过)
作用
在指定的方法调用前后执行预先设定的代码(比如权限的校验就是在访问controller之前校验)
阻止原始方法的执行(把原始的方法终止掉)
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 拦截器
* @author THINK
*
*/
public class LogCostInterceptor implements HandlerInterceptor {
private long start;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
start = System.currentTimeMillis();
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println("Interceptor 耗时:"+(System.currentTimeMillis()-start));
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}
这里我们需要实现HandlerInterceptor这个接口,这个接口包括三个方法,preHandle是请求执行前执行的,postHandler是请求结束执行的,除了实现上面的接口外,我们还需对其进行配置:
import com.suke.springbootdemo1.intercept.LogCostInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* 拦截器配置类
* @author THINK
*
*/
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册拦截器
registry.addInterceptor(new LogCostInterceptor()).addPathPatterns("/**");
}
}
拦截器与过滤器的区别
归属不同:Filter属于Servlet技术,Interceptor属于SpringMVC技术
拦截器内容不同:Filter对所有访问进行增强(在Tomcat服务器进行配置),Interceptor仅针对SpringMVC的访问进行增强
总结
在软件开发中,拦截器常常被应用于各种不同的框架和技术中,比如在Web开发中的Java Servlet中,Spring框架中的拦截器,以及在移动应用开发中的各种框架中。
拦截器模式的基本结构包括以下几个要素:
Handler(处理器):负责处理实际请求的组件,可以是一个对象、一个方法或者一个类。
Interceptor(拦截器):拦截器是一个包含预处理、后处理、完成后处理、异常处理等方法的接口。在拦截器中,开发者可以编写自己的逻辑来处理请求。
Interceptor链:拦截器链是由多个拦截器组成的链表,每个拦截器依次处理请求,然后将请求传递给下一个拦截器,直到所有拦截器处理完毕。
Client(客户端):负责生成请求的对象,将请求传递给拦截器链进行处理。
在一个典型的拦截器模式中,当一个请求被发起时,它会经过拦截器链中的所有拦截器,每个拦截器可以在请求的前、后或异常处理时执行特定的操作。这种方式使得系统的处理逻辑更加灵活,可以根据需要动态地增加、删除或修改拦截器,而不需要修改已有的处理器和客户端代码。
拦截器模式的优点包括了解耦、复用性高、易于扩展等。通过拦截器,可以将一些通用的功能从业务逻辑中分离出来,提高了代码的可维护性和可读性。