一拦截器
一、拦截器(Interceptor)

定义:拦截器是在面向切面编程(AOP)中常用的一种机制,用于在方法执行之前或之后进行拦截,并附加特定操作;其底层通常基于 Java 的反射机制实现。拦截器属于 AOP 的一种实现方式。在 WebWork 中,拦截器是对 Action 调用进行动态拦截的对象,它为开发者提供了一种机制:既可以在 Action 执行前后编写自定义代码,也可以在 Action 执行前直接阻止其继续执行。同时,拦截器还能够提取 Action 中可复用的公共逻辑,从而减少 Action 中的重复代码,提升代码复用性与可维护性。当提交对 Action 的请求时,ServletDispatcher 会根据请求调度并执行对应的 Action;而在 Action 真正执行之前,请求会先被 Interceptor 拦截,随后拦截器在 Action 执行前后完成相应处理。 二、在ssm中的实现
SpringMVC 中的 Interceptor 请求拦截,通常通过 HandlerInterceptor 来实现,主要有两种方式: 第一种:自定义 Interceptor 类并实现 Spring 的 HandlerInterceptor 接口,或者继承已经实现了 HandlerInterceptor 接口的类,例如 Spring 提供的抽象适配类 HandlerInterceptorAdapter; 第二种:自定义 Interceptor 类,实现 Spring 的 WebRequestInterceptor 接口,或者继承实现了 WebRequestInterceptor 的相关类。 三、在springboot中的实现
第一种: 创建 LogCostInterceptor 类并实现 HandlerInterceptor 接口;创建配置类 WebConfiguration 继承 WebMvcConfigurationSupport(或者 WebMvcConfigurerAdapter);然后添加 @Configuration 注解; 这里使用的是 @Configuration
public class WebConfiguration extends WebMvcConfigurationSupport {
private Logger logger = LoggerFactory.getLogger(WebConfiguration.class);@Overridepublic void addInterceptors(InterceptorRegistry registry){// 多个拦截器可以组成一个拦截器链// addPathPatterns 用于添加拦截规则// excludePathPatterns 用于排除不需要拦截的路径registry.addInterceptor(new LogCostInterceptor()).addPathPatterns().excludePathPatterns("/swagger-ui.html");} }
四、 拦截器中三个方法的详细解释
SpringMvc 中的拦截器是链式执行的,在一个应用或一次请求中可以配置多个 Interceptor,执行顺序通常按照声明顺序进行,首先依次执行每个拦截器中的 preHandle 方法。 1)preHandle:在请求到达 controller 之前执行,可以在该方法中完成初始化操作、请求预处理,或者进行条件判断来决定请求是否继续执行。返回值如果为 true,则继续执行后续 Interceptor 的 preHandle 和 controller;如果为 false,则表示请求被中断并直接结束。 2)postHandle:当 preHandle 返回 true 后执行。它会在 controller 执行完成之后、DispatcherServlet 进行视图渲染之前被调用;在该方法中可以对 ModelAndView 对象进行进一步处理。postHandle 在拦截器链中的执行顺序与 preHandle 相反,也就是先执行 preHandle 的拦截器,后执行它的 postHandle。 3)afterCompletion:在 preHandle 返回 true 后执行。该方法会在整个请求处理完成之后,也就是 DispatcherServlet 渲染完对应视图后被调用。主要作用是进行资源释放与清理工作。 二 拦截器
一 、定义:
Filter 是实现了 javax.servlet.filter 接口的服务器端程序; 二、 用途:
设置字符编码、权限控制、请求转发控制、业务逻辑判断等。 三、 工作原理:
在 web.xml 文件中配置需要拦截的客户端请求后,Filter 就可以对这些请求进行统一拦截。此时可以对请求或响应统一设置编码、简化通用处理逻辑;同时也可以进行业务判断,例如用户是否已经登录、是否具备访问当前页面的权限等。Filter 会随着 Web 应用的启动而初始化,并且通常只初始化一次,之后即可持续拦截相关请求;只有当 Web 应用停止或重新部署时才会销毁。Filter 主要用于对用户请求进行预处理,也可以对 HttpServletResponse 进行后处理,是一种典型的责任链处理机制。 四、 流程:
Filter 先对用户请求进行预处理,然后将请求交给 Servlet 处理并生成响应,最后 Filter 再对服务器返回的响应结果进行后处理。 五、 用处:
在 HttpServletRequest 到达 Servlet 之前,可以先拦截客户端的 HttpServletRequest。根据实际需要检查 HttpServletRequest,也可以修改 HttpServletRequest 的请求头和请求数据。在 HttpServletResponse 返回到客户端之前,也可以拦截 HttpServletResponse,并根据需要检查或修改 HttpServletResponse 的响应头和响应数据。 六、 种类:
用户授权 Filter:负责检查用户请求,并根据规则过滤非法请求。日志 Filter:用于详细记录某些特殊用户请求。解码 Filter:用于处理非标准编码请求的解码问题。还能改变 XML 内容的 XSLT Filter 等。Filter 可以同时负责拦截多个请求或响应;同一个请求或响应也可以被多个 Filter 共同拦截处理。 七、 使用:
1 创建 Myfilter 类并实现 Filter,重写 init 和 doFilter 方法 ② 在 init 方法中初始化自定义参数,参数名称可以设置为需要放行的 url,用于过滤配置,也就是直接放过该请求; ③ 在 doFilter 中可以进行认证、鉴权等处理,之后再执行相应业务逻辑; 也可以在这里完成跨域设置; 在 doFilter 中,chain.doFilter(req, res) 是请求与响应处理的分界点,执行该方法之前表示对用户请求进行预处理;执行该方法之后表示对服务器响应进行后处理 1)第一种方案 a: 在 Myfilter 类上添加注解@WebFilter ,多个 Myfilter 时还可以添加 @Order(1) 按顺序执行。@WebFilter 的常见参数值包括(filterName = "Myfilter", urlPatterns = "/snow/api/*",initParams = {@WebInitParam(name = "url", value = "/snow/api/login")})其中 filterName 表示过滤器名称,urlPatterns 表示拦截地址,initParams 表示放行地址,即不需要检测的路径 b: 在 springboot 的启动类上添加 @ServletComponentScan2)第二种方案a:在 Myfilter 类上添加注解@Component,交给 Spring 容器管理b:创建一个 config 类,添加注解 @Configuration
public class config {
@Beanpublic FilterRegistrationBean webAuthFilterRegistration() {FilterRegistrationBean registration = new FilterRegistrationBean();registration.setFilter(myfilte());registration.setName("Myfilter");registration.addUrlPatterns("/snow/api/*");registration.addInitParameter("url", "/snow/api/login");registration.setOrder(0); //设置顺序return registration;}@Beanpublic Filter myfilter() {return new Myfilter();} }
三 过滤器和拦截器的比较
一、区别和不同 相同点:过滤器和拦截器本质上都体现了 AOP 编程思想。 不同点: 使用范围不同:过滤器只能应用在 Web 应用程序中,也就是运行在 Servlet 容器内部;而拦截器不仅可以用于 Web 应用,还可以应用在 JavaSE 等多种环境中。使用资源不同:拦截器是 Spring 体系中的组件,由 Spring 容器进行管理,因此可以直接使用 Spring 提供的各种资源,例如 Service 对象、事务管理器、数据源等,并可通过 IOC 注入获得;而过滤器通常不具备这一能力。使用深度(范围)不同:过滤器主要在 Servlet 前后起作用;拦截器则可以深入到方法调用前后、异常抛出前后等更多场景,扩展性和灵活性更强。执行顺序不同:Filter 是由 Server(例如 Tomcat、Netty)调用;Interceptor 则是由 Spring 框架调用;因此在实际请求链路中,Filter 通常会先于 Interceptor 执行。 使用选择:在 Spring 架构下进行开发时,通常优先考虑使用拦截器。 二、 过滤器和拦截器的执行流程图