文章目录区别适用场景附怎么用Spring MVC基础知识包含Filter 和 Interceptorhttps://blog.csdn.net/2303_80236475/article/details/146186506?spm1001.2014.3001.5502请求完整链路浏览器请求 → Tomcat 容器 → FilterServlet 规范 → DispatcherServlet → InterceptorSpringMVC 框架 → Controller区别对比维度Filter 过滤器Interceptor 拦截器规范归属Servlet 原生规范Tomcat 容器管理SpringMVC 框架组件Spring 容器管理执行时机DispatcherServlet之前执行DispatcherServlet之后、Controller 之前执行拦截粒度拦截所有请求静态资源、图片、js、jsp、接口只拦截 Controller 控制器请求不拦截静态资源默认依赖容器不依赖 Spring纯 Servlet 项目可用必须依赖 SpringMVC仅 Spring 环境生效获取对象只能拿到原生ServletRequest/ServletResponse可以拿到 Spring 上下文、Controller 处理器、ModelAndView拦截时机细分只有doFilter一个方法放行前后两段逻辑三段方法preHandle /postHandle/afterCompletion可操作视图能否拿到 Controller不能执行时还没映射处理器可以handler 参数就是目标 Controller 方法对象异常捕获只能捕获自身 doFilter 内异常Controller 异常捕获不到afterCompletion 能接收 Controller 抛出的完整异常应用场景编码统一设置、跨域、静态资源过滤、全局请求编码登录权限校验、接口日志记录、修改 Model 视图、接口 Token 校验适用场景适合用 Filter 实现的功能统一设置全局请求编码request.setCharacterEncoding(UTF-8)CORS 跨域处理请求到达 Spring 之前就要放行跨域头静态资源缓存、防盗链、文件上传底层预处理处理 Servlet 原生全局请求不依赖 Spring 环境。适合用 Interceptor 实现的功能基于Controller 方法注解做权限控制如LoginRequired、AdminOnly统一向页面 Model 注入全局公共数据打印接口日志记录请求方法、类名、接口注解、方法参数接口 Token 校验需要调用业务 Service 查询用户信息动态修改返回视图名称。附怎么用以防忘记怎么用附个小Demo过滤器Filter//WebFilter(/*)publicclassLoginFilterimplementsFilter{// 容器启动初始化一次Overridepublicvoidinit(FilterConfigfilterConfig)throwsServletException{System.out.println(Filter 初始化);}// 每次请求都会执行OverridepublicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{HttpServletRequestreq(HttpServletRequest)request;System.out.println(Filter 前置逻辑登录校验);// 放行执行后续资源拦截器、Controllerchain.doFilter(request,response);// 响应回来后的后置逻辑System.out.println(Filter 后置逻辑响应处理);}// 容器销毁执行Overridepublicvoiddestroy(){System.out.println(Filter 销毁);}}Interceptor 拦截器publicclassLoginInterceptorimplementsHandlerInterceptor{// 1. Controller 执行前返回false直接拦截请求OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{System.out.println(Interceptor preHandle登录校验);// true放行false拦截不会进入Controllerreturntrue;}// 2. Controller执行完视图渲染前OverridepublicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)throwsException{System.out.println(Interceptor postHandle修改视图数据);}// 3. 视图渲染完成后最后执行异常也会走这里OverridepublicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)throwsException{System.out.println(Interceptor afterCompletion资源释放、异常记录);}}