- 什么是过滤器
// 过滤器是servlet的特性之一,实现Filter接口的java类,是对servlet请求和响应中增加特定功能,
Filter接口中有三个方法 init doFilter destroy
1.init() web容器在启动时会调用这个方法,初始化过滤器工作
2.doFilter() 当请求或是响应被拦截之后 在这里被处理
3.destroy() 关闭filter对象 释放过滤器
-实现filter
//使用注解的方式来配置过滤器
@Component
@WebFilter(filterName = "FilterTest",urlPatterns = {"/*"})
public class FilterTest implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化过滤器...");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("请求进入过滤器...");
HttpServletRequest httprq = (HttpServletRequest)servletRequest;
HttpServletResponse httprp = (HttpServletResponse)servletResponse;
String requestURI = httprq.getRequestURI();
System.out.println("过滤器请求开始"+requestURI);
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("过滤器请求结束");
}
@Override
public void destroy() {
System.out.println("关闭释放过滤器...");
}
}
- 什么是拦截器 Interceptor
在springmvc中有拦截器,它的作用是拦截用户请求并做出相应的处理,
里面有三个方法
1.preHandle() 预处理方法 在controller之前拦截 对请求进行判断 true通过 false 拦截
2.postHandle() 后处理方法 在controller之后执行 响应之前 处理之后
3.afterCompletion() 最后执行方法 请求处理之后
- 实现拦截器
public class InterceptorTest implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String requestURI = request.getRequestURI();
System.out.println("拦截器开始拦截"+requestURI);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
int status = response.getStatus();
System.out.println("响应之前"+status);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
String requestURI = request.getRequestURI();
System.out.println("响应之后"+requestURI);
}
}
===============
public class InterceptorConfig implements WebMvcConfigurer {
/**
* 配置拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptors())
.addPathPatterns("/**");
}
@Bean
public InterceptorTest myInterceptors(){
return new InterceptorTest();
}
}
-区别
1.本质上 过滤器filter 是servlet容器技术 拦截器属于springmvc。
2.执行顺序是:请求进入容器-进入过滤器-进入servlet-进入拦截器-执行controller。
过滤器先执行 拦截器后执行。
3.实现方式不同: 过滤器是基于回调函数实现的 需求调用filterChain方法的dofilter方法来执行
拦截器是基于动态代理反射实现的。
4.过滤器是Servlet技术规范 是依赖于Servlet容器 所有只能存在web项目
而拦截器是spring中的一个组件,既可以在web项目中也可以在Application项目中
5.过滤器一般用于功能实现,而是拦截器一般用于业务处理。