springBoot项目配置过滤器(filter)拦截器(Interceptor)
过滤器(Filter) 拦截器(Interceptor)的区别
Filter 过滤器:
import javax.servlet.*;
import java.io.IOException;
import java.util.Date;
// 过滤器
//@Component
public class TimeFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("time filter init");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("time filter start");
long startTime = new Date().getTime();
filterChain.doFilter(servletRequest,servletResponse);
long endTime = new Date().getTime();
System.out.println("time filter:" + (endTime - startTime));
System.out.println("time filter finish");
}
@Override
public void destroy() {
System.out.println("time filter destroy");
}
}
interceptor 拦截器:
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
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.Date;
// 拦截器
@Component
public class TimeInterceptor implements HandlerInterceptor {
// 进入controller之前
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String username = request.getParameter("username");
System.out.println("username"+username);
System.out.println("preHandle");
System.out.println(((HandlerMethod)handler).getBean().getClass().getName()); // 类名
System.out.println(((HandlerMethod)handler).getMethod().getName()); // 方法名
request.setAttribute("startTime",new Date().getTime());
return true; // 是否调用后续方法(controller接口方法、postHandle、afterCompletion)
}
// controller接口方法正常执行才会执行postHandle方法
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
Long startTime = (Long) request.getAttribute("startTime");
System.out.println("拦截器耗时:"+(new Date().getTime() - startTime));
System.out.println("postHandle");
}
// controller接口方法正常执行、抛出异常都会执行afterCompletion方法
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
Long startTime = (Long) request.getAttribute("startTime");
System.out.println("拦截器耗时:"+(new Date().getTime() - startTime));
System.out.println("afterCompletion");
System.out.println("ex is "+ex);
}
}
配置类:
import com.imooc.web.filter.TimeFilter;
import com.imooc.web.interceptor.TimeInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.ArrayList;
import java.util.List;
@Configuration // 配置类(配置过滤器、拦截器)
public class WebConfig implements WebMvcConfigurer {
// 配置自定义过滤器为bean到spring IOC容器中
@Bean
public FilterRegistrationBean timeFilter(){
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(new TimeFilter()); // 注册自定义过滤器
List<String> URLS = new ArrayList<>();
URLS.add("/*");
filterRegistrationBean.setUrlPatterns(URLS);// 配置需要拦截的资源
return filterRegistrationBean;
}
// 配置spring拦截器(interceptor)1.继承WebMvcConfigurer 接口 2.实现addInterceptors方法
@Autowired
private TimeInterceptor timeInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(timeInterceptor); // 注册拦截器
}
}
假如我们需要使用spring AOP切面需要引入AOP依赖
<!--配置AOP使用spring切面-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
切片类
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import java.util.Date;
// 切面类
@Aspect
@Component
public class TimeAspect {
// @Before() // 之前
// @After() // 之后
// @AfterThrowing // 抛出异常执行
// @Around() // 包含以上三种
@Around("execution(* com.imooc.web.controller.UserController.*(..))") // 配置环绕,并且配置切入点表达式
public Object handleControllerMethod(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("time aspect start");
Object[] args = pjp.getArgs();// 方法参数的数组
for (Object arg : args) {
System.out.println("arg is "+ arg);
}
long start = new Date().getTime();
Object object = pjp.proceed();// 调用被拦截的controller方法
System.out.println("耗时:"+(new Date().getTime() - start));
System.out.println("time aspect end");
return object;
}
}