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 {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化操作
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// todo 你想做的过滤操作
// 调用下一个过滤器或目标资源的处理方法
chain.doFilter(request, response);
}
@Override
public 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;
}
//方法执行前执行的接口
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("拦截器执行=========");
//可以在方法执行前执行其他的类
Optional<UserEntity> byId = userRepository.findById(1);
return true;
}
//方法执行后执行的方法
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
//返回处理的方法
@Override
public 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;
//将需要的类进行注入
@Autowired
public BaseInterceptorConfig(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new BaseInterceptor(userRepository))// 添加拦截器
.addPathPatterns("/**") //添加拦截路径
.excludePathPatterns("/swagger/**", "/swagger2/**");//排除的拦截路径(此路径不拦截)
}
}
3 AOP注解,当然你也可以通过AOP来实现拦截的功能。在前后做一些事情
在Spring Boot中,AOP是一种更为灵活,可以理解成对调用方法的增强,它几乎可以自定义拦截到你代码里面任何想拦截的地方。