怎么自己建立网站及建立网站方法,辽宁网站建设学校,淘宝上的网站建设为什么便宜,专门做软陶的网站目录 一、拦截器#xff08;Interceptor#xff09;和过滤器#xff08;Filter#xff09;#xff1a;都是“守门员”#xff01;二、如何实现拦截器和过滤器#xff1f;三、拦截器和过滤器的区别四、执行顺序五、真实的应用场景六、总结 #x1f31f;如果喜欢作者的讲… 目录 一、拦截器Interceptor和过滤器Filter都是“守门员”二、如何实现拦截器和过滤器三、拦截器和过滤器的区别四、执行顺序五、真实的应用场景六、总结 如果喜欢作者的讲解方式关注作者不迷路同时也可以看看我的其他文章 感谢 从乐高积木到乐队指挥用最通俗易懂的方式带你玩转 Spring Boot Bean 就让我用这篇文章来讲解 SpringBoot 的拦截器和过滤器吧给它安排明白
一、拦截器Interceptor和过滤器Filter都是“守门员”
想象一下你的 SpringBoot 应用就像一个豪华酒店。
过滤器Filter 就像酒店大门口的保安负责检查所有进出酒店的人请求。它可以决定是否允许客人进入或者在客人进入前做一些处理比如检查身份证、测量体温️。拦截器Interceptor 就像酒店内部各个楼层的楼层经理只负责检查进入特定楼层Controller的客人。它可以在客人进入楼层前、进入楼层后、离开楼层后都进行干预比如登记访客信息、提供楼层指引️。
二、如何实现拦截器和过滤器
1. 过滤器Filter
步骤一 创建一个类实现 javax.servlet.Filter 接口。步骤二 实现 doFilter() 方法。这个方法就是过滤器的核心逻辑在这里你可以对请求和响应进行处理。步骤三 使用 WebFilter 注解或者在 WebConfig 类中注册过滤器。
// 方式一使用 WebFilter 注解
WebFilter(urlPatterns /*, filterName MyFilter) // 拦截所有请求
public class MyFilter implements Filter {Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println(过滤器请求来了我要检查一下);// 可以对 request 和 response 进行处理HttpServletRequest req (HttpServletRequest) request;String uri req.getRequestURI();System.out.println(请求的URI uri);// 放行让请求继续往下走chain.doFilter(request, response);System.out.println(过滤器请求走了我要记录一下);}
}// 方式二在 WebConfig 类中注册
Configuration
public class WebConfig {Beanpublic FilterRegistrationBeanMyFilter myFilterRegistrationBean() {FilterRegistrationBeanMyFilter registration new FilterRegistrationBean();registration.setFilter(new MyFilter());registration.addUrlPatterns(/*); // 拦截所有请求registration.setName(MyFilter);registration.setOrder(1); // 设置优先级数字越小优先级越高return registration;}
}2. 拦截器Interceptor
步骤一 创建一个类实现 org.springframework.web.servlet.HandlerInterceptor 接口。步骤二 实现 preHandle()、postHandle()、afterCompletion() 方法。 preHandle()在 Controller 处理请求之前调用可以进行权限验证、参数校验等。如果返回 false则请求会被拦截不会继续执行。postHandle()在 Controller 处理请求之后但在视图渲染之前调用可以对 ModelAndView 进行修改。afterCompletion()在整个请求处理完毕之后调用可以进行资源清理、日志记录等。 步骤三 创建一个配置类实现 org.springframework.web.servlet.config.annotation.WebMvcConfigurer 接口并重写 addInterceptors() 方法将拦截器注册到 Spring 容器中。
public class MyInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println(拦截器Controller 要处理请求了我要先检查一下♀️);// 可以进行权限验证、参数校验等String token request.getHeader(token);if (token null || token.isEmpty()) {System.out.println(拦截器没有 token拒绝访问);response.setStatus(401); // 返回未授权状态码return false; // 拦截请求}return true; // 放行请求}Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println(拦截器Controller 处理完请求了我可以修改 ModelAndView);// 可以对 ModelAndView 进行修改if (modelAndView ! null) {modelAndView.addObject(message, 拦截器添加的额外信息);}}Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println(拦截器请求处理完成了我可以清理资源、记录日志);// 可以进行资源清理、日志记录等}
}Configuration
public class InterceptorConfig implements WebMvcConfigurer {Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyInterceptor()).addPathPatterns(/api/**) // 拦截 /api/ 下的所有请求.excludePathPatterns(/api/login); // 排除 /api/login 请求}
}三、拦截器和过滤器的区别
特性过滤器Filter拦截器Interceptor实现方式实现 javax.servlet.Filter 接口实现 org.springframework.web.servlet.HandlerInterceptor 接口拦截范围拦截所有进出 Servlet 容器的请求拦截特定的 Controller 方法执行时机在 DispatcherServlet 之前和之后执行在 Controller 方法执行之前、之后和完成之后执行依赖性不依赖 Spring 容器依赖 Spring 容器可以访问 Spring 上下文功能字符编码转换、请求内容过滤、敏感词过滤等权限验证、日志记录、参数校验等精确度粗粒度只能拦截 URL细粒度可以访问 HandlerMethod获取方法信息
总结
过滤器 拦截所有请求不依赖 Spring功能比较通用。拦截器 拦截特定 Controller 方法依赖 Spring功能更精细。
四、执行顺序
过滤器Filter在 DispatcherServlet 之前执行。拦截器Interceptor preHandle()在 Controller 方法执行之前执行。Controller 方法执行。postHandle()在 Controller 方法执行之后但在视图渲染之前执行。视图渲染。afterCompletion()在整个请求处理完毕之后执行。
记住 多个过滤器和拦截器可以配置执行顺序通常通过 order 属性或者 Order 注解来设置数字越小优先级越高。
五、真实的应用场景
过滤器 字符编码转换 统一设置请求和响应的字符编码避免乱码。XSS 攻击防御 过滤请求中的恶意脚本防止 XSS 攻击。日志记录 记录所有请求的 URL、IP 地址等信息。 拦截器 权限验证 检查用户是否已登录是否有权限访问特定资源。参数校验 校验请求参数的合法性防止恶意请求。性能监控 记录 Controller 方法的执行时间分析性能瓶颈。防止重复提交 避免用户重复提交表单。
六、总结
过滤器 就像酒店大门口的保安啥人都拦主要做一些通用的检查比如身份证、体温啥的。拦截器 就像楼层经理只管特定楼层的人可以做更细致的检查比如登记访客信息、提供楼层指引。执行顺序 先保安再楼层经理。保安先检查楼层经理在客人进房间前、进房间后、离开房间后都可以管。 如果编写了AOP逻辑会在拦截器之后执行相关内容请看 被重复代码逼疯AOP来当“舔狗”日志/事务/权限随叫随到 希望这篇文章能让你有趣的理解 SpringBoot 的拦截器和过滤器