1 Filter
Filter常被叫做过滤器,filter的调用周期大致如下
也就是说filter在servlet之前,没有办法在filter中获取springboot中的java bean对象。
Filter生命周期方法
init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源。
doFilter:每一次请求被拦截资源时,会执行。执行多次。
destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源
值得注意的是,Filter并不依赖于Springboot,是javaWeb自带的,所以即使你用的其他框架,也完全不受影响。
filter的使用如下(个人比较喜欢用注解的方式)
package cn.iyuta.golive.filter;import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;@WebFilter(filterName = "MyFilter", urlPatterns = {"/v/*"})
public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 初始化操作}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// todo 你想做的过滤操作// 调用下一个过滤器或目标资源的处理方法chain.doFilter(request, response);}@Overridepublic void destroy() {// 销毁操作}
}
2 Interceptor
Interceptor常被叫做拦截器,加上Interceptor,filter后的调用周期大致如下
在Spring Boot中,拦截器是一种用于拦截和处理HTTP请求的机制。它是Spring框架提供的一种中间件,用于在请求到达控制器(Controller)之前或之后执行一些共享的逻辑。
值得注意的是,Intercepter是基于Springboot的,其他框架是无法使用的,而且由于其基于java bean,所以在其当中你可以将任何java bean传入其中,使得你可以获取上下文路径等信息。
Intercepter调用函数
preHandle:调用 Controller之前执行。
postHandle:调用 Controller之前执行。
Intercepter的使用如下
自定义Intercepter
package cn.iyuta.golive.interceptor;import cn.iyuta.golive.entity.UserEntity;
import cn.iyuta.golive.repository.UserRepository;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Optional;public class BaseInterceptor implements HandlerInterceptor {//可以通过配置类注入想要的类private final UserRepository userRepository;public BaseInterceptor(UserRepository userRepository){this.userRepository = userRepository;}//方法执行前执行的接口@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("拦截器执行=========");//可以在方法执行前执行其他的类Optional<UserEntity> byId = userRepository.findById(1);return true;}//方法执行后执行的方法@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {}//返回处理的方法@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {}
}
设置拦截的规则:
package cn.iyuta.golive.interceptor;import cn.iyuta.golive.repository.UserRepository;
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.WebMvcConfigurer;@Configuration
public class BaseInterceptorConfig implements WebMvcConfigurer {private final UserRepository userRepository;//将需要的类进行注入@Autowiredpublic BaseInterceptorConfig(UserRepository userRepository) {this.userRepository = userRepository;}@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new BaseInterceptor(userRepository))// 添加拦截器.addPathPatterns("/**") //添加拦截路径.excludePathPatterns("/swagger/**", "/swagger2/**");//排除的拦截路径(此路径不拦截)}
}
3 AOP注解,当然你也可以通过AOP来实现拦截的功能。在前后做一些事情
在Spring Boot中,AOP是一种更为灵活,可以理解成对调用方法的增强,它几乎可以自定义拦截到你代码里面任何想拦截的地方。