我们在登陆的时候,不加拦截器的话,首页不需要登陆也可以访问,为了解决不登陆也能访问的问题,就需要拦截器和过滤器
①Filter说明
配置简单,只需要实现Filter接口即可,通过@WebFilter注解进行请求拦截,Filter内部定义了三个方法,分别是init(),doFilter(),destroy()
init():容器的初始化,只会被调用一次,在容器初始化的时候被调用
doFilter():在容器的每一次调用的时候,都会被调用,FilterChain用来做请求拦截和放行
destory():只会被调用一次,在容器销毁的时候会被调用
②WebFilter注解使用说明
@WebFilter 用于将一个类声明为过滤器,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为过滤器。该注解具有下表给出的一些常用属性 ( 以下所有属性均为可选属性,但是 value、urlPatterns、servletNames 三者必需至少包含一个,且 value 和 urlPatterns 不能共存,如果同时指定,通常忽略 value 的取值 )
③注意点
使用SpringBoot注册拦截器的时候,不要忘记在启动类上加上注解@ServletComponentScan,否则拦截器不生效,如果要指定启动顺序,加上@Order(1) // filter顺序 越小越在前注解
拦截器是一种链式调用,在一个应用中可以存在多个拦截器,一个请求也是可以触发多个拦截器,咩个拦截器的调用顺序我们可以自己指定,实现方式上也是比较简单的,首先自己定义一个拦截器实现HandInterceptor接口,然后在自己定义的类中实现WebMvcConfigurer中进行注册
过滤器和拦截器均体现了AOP的编程思想,实现方式上也存在不同,主要从实现原理,使用范围,触发时机,请求范围几个方面来讲解
①实现原理:
过滤器主要通过实现特定的接口(如 Java 中的 Filter)来实现功能,它针对的是特定的技术框架。而拦截器则通常是通过代理机制(如 Java 中的 AOP 代理)实现,可以应用于多种技术框架。
②使用范围:
过滤器通常用于处理 HTTP 请求,例如在 Web 应用中对请求进行预处理或后处理。而拦截器则可以应用于多个层次,既可以处理 HTTP 请求,也可以处理方法调用、对象创建等。
③触发时机:
过滤器一般在请求处理之前或之后触发,具体时机取决于过滤器的配置。而拦截器则可以在方法执行前、方法执行后、抛出异常时等多个时机触发。
④请求范围:
过滤器通常作用于一个请求,即处理完一个 HTTP 请求后才会继续处理下一个请求。而拦截器则可以作用于一个具体的方法调用,同一个拦截器可以被多次触发。
@WebFilter(filterName = "MyFilter",urlPatterns = "/*")
@Slf4j
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("MyFilter初始化。。。。。");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
log.info("MyFilter拦截器开始执行前");
filterChain.doFilter(servletRequest,servletResponse);
log.info("MyFilter拦截器开始执行后");
}
}
注意:不要忘记在启动累上加上@ServletComponentScan注解,否则拦截器不生效
①定义MyInterceptor实现HandlerInterceptor接口
@Component
@Slf4j
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("MyInterceptor拦截生效");
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
②在WebMvcConfigurer中进行注册
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor())
//拦截的地址
.addPathPatterns("/**")
//放行的地址
.excludePathPatterns("/hello");
}
}
拦截器主要应用于 Java Web 框架中,如 Spring MVC、Struts 等。拦截器可以拦截请求和响应,实现对请求的处理、对响应的修改等。拦截器的使用场景包括:
权限控制:在请求处理之前,检查用户是否具有访问特定资源的权限。
性能监控:记录请求的执行时间、系统负载等信息,以便于性能分析和调优。
功能增强:在请求处理之前或之后,添加特定的功能,如日志记录、参数校验等。
日志记录:记录请求的详细信息,包括请求方法、URL、参数等。
过滤器是 Java Web 中的一种通用技术,可以应用于多种 Web 服务器和框架中。过滤器主要处理请求和响应,实现对请求内容的过滤、对响应内容的修改等。过滤器的使用场景包括:
输入验证:过滤器可以对请求的参数进行验证,确保请求内容的合法性。
输出过滤:过滤器可以对响应内容进行过滤,如去除敏感信息、添加响应头等。
文件上传过滤:在文件上传时,过滤器可以检查文件类型、大小等,防止恶意文件上传。
缓存控制:过滤器可以根据请求的 URL、参数等信息,判断请求是否需要从缓存中获取数据。
拦截器主要应用于 Web 框架中,使用反射机制实现,可以访问请求和响应对象的属性和方法;过滤器则主要应用于 Java Web 服务器中,使用回调函数实现,只能访问请求和响应对象的输入流和输出流。拦截器和过滤器的使用场景有所不同,需要根据具体需求选择合适的技术。
拦截器和过滤器代码地址
更多内容请查看码云仓库