当前位置: 首页 > wzjs >正文

淄博做网站优化瑞金网络推广

淄博做网站优化,瑞金网络推广,阿里云wordpress建站,基于站点的推广Spring 过滤器链(Filter Chain)完整示例 核心目标 展示 多个 Filter 组成过滤器链的完整实现,包含 init()、doFilter()、destroy() 全生命周期方法,以及如何通过 FilterRegistrationBean 控制执行顺序。 代码结构 Filter 1&…

Spring 过滤器链(Filter Chain)完整示例


核心目标

展示 多个 Filter 组成过滤器链的完整实现,包含 init()doFilter()destroy() 全生命周期方法,以及如何通过 FilterRegistrationBean 控制执行顺序。


代码结构
  1. Filter 1:记录请求时间(TimingFilter)。
  2. Filter 2:跨域处理(CorsFilter)。
  3. Filter 链配置:通过 FilterRegistrationBean 控制顺序。
  4. 测试 Controller:验证过滤器链执行流程。

完整代码示例

1. Filter 1:记录请求时间
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebFilter // 可选注解(需配合 @ServletComponentScan)
public class TimingFilter implements Filter {private long startTime; // 记录请求开始时间// 初始化方法(Filter 容器启动时调用一次)@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("TimingFilter 初始化完成");// 可读取 Filter 配置参数(如 filterConfig.getInitParameter("key"))}// 核心过滤方法(每个请求触发一次)@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {startTime = System.currentTimeMillis();System.out.println("TimingFilter 前置处理开始");// 继续 Filter 链或 Controllerchain.doFilter(request, response); long endTime = System.currentTimeMillis();System.out.println("TimingFilter 后置处理,总耗时:" + (endTime - startTime) + "ms");}// 销毁方法(应用关闭时调用一次)@Overridepublic void destroy() {System.out.println("TimingFilter 销毁");}
}

2. Filter 2:跨域处理
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse;@WebFilter
public class CorsFilter implements Filter {// 初始化方法(Filter 容器启动时调用一次)@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("CorsFilter 初始化完成");}// 核心过滤方法(每个请求触发一次)@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {HttpServletResponse httpResponse = (HttpServletResponse) response;httpResponse.setHeader("Access-Control-Allow-Origin", "*");httpResponse.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");System.out.println("CorsFilter 前置处理");chain.doFilter(request, response); // 继续后续处理System.out.println("CorsFilter 后置处理");}// 销毁方法(应用关闭时调用一次)@Overridepublic void destroy() {System.out.println("CorsFilter 销毁");}
}

3. Filter 链配置类
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class FilterConfig {// 注册 TimingFilter(顺序1)@Beanpublic FilterRegistrationBean<TimingFilter> timingFilterRegistration() {FilterRegistrationBean<TimingFilter> registration = new FilterRegistrationBean<>();registration.setFilter(new TimingFilter());registration.addUrlPatterns("/*"); // 拦截所有路径registration.setOrder(1); // 优先级最高(数值越小优先级越高)return registration;}// 注册 CorsFilter(顺序2)@Beanpublic FilterRegistrationBean<CorsFilter> corsFilterRegistration() {FilterRegistrationBean<CorsFilter> registration = new FilterRegistrationBean<>();registration.setFilter(new CorsFilter());registration.addUrlPatterns("/*");registration.setOrder(2); // 优先级次之return registration;}
}

4. 测试 Controller
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class TestController {@GetMapping("/test")public String test() {System.out.println("Controller 方法执行");return "Hello from Controller!";}
}

5. 启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

执行流程与输出结果

访问 /test 接口时,控制台输出如下:

TimingFilter 初始化完成
CorsFilter 初始化完成
// 请求到达时:
TimingFilter 前置处理开始
CorsFilter 前置处理
Controller 方法执行
CorsFilter 后置处理
TimingFilter 后置处理,总耗时:Xms
// 应用关闭时:
CorsFilter 销毁
TimingFilter 销毁

关键流程说明
  1. Filter 链执行顺序

    • 初始化阶段:所有 Filter 的 init() 按注册顺序执行(先 TimingFilterCorsFilter)。
    • 请求处理阶段
      • 前置处理:按 setOrder() 顺序执行(TimingFilter 先于 CorsFilter)。
      • 后置处理:按逆序执行(CorsFilter 先后置,再 TimingFilter 后置)。
    • 销毁阶段:按初始化顺序的逆序执行(先销毁 CorsFilterTimingFilter)。
  2. 执行流程图

    请求到达 →
    ├─ TimingFilter.doFilter() →
    │  ├─ 前置处理 →
    │  │  └─ 调用 chain.doFilter() →
    │  │     ├─ CorsFilter.doFilter() →
    │  │     │  ├─ 前置处理 →
    │  │     │  │  └─ 调用 chain.doFilter() → Controller →
    │  │     │  └─ 后置处理 →
    │  │     └─ 返回到 TimingFilter →
    │  └─ 后置处理(计算总耗时) →
    └─ 响应返回
    

代码注释详解
  • TimingFilter

    • init():初始化时打印日志,可读取配置参数。
    • doFilter():记录请求开始时间,调用 chain.doFilter() 继续链,后置处理计算耗时。
    • destroy():释放资源(如关闭数据库连接)。
  • CorsFilter

    • init():初始化时打印日志。
    • doFilter():设置 CORS 头,调用 chain.doFilter() 继续链。
    • destroy():清理资源。
  • FilterRegistrationBean

    • setOrder(1):确保 TimingFilter 先于 CorsFilter 执行。
    • addUrlPatterns("/*"):拦截所有请求路径。

总结表格
Filter 名称功能执行顺序关键方法生命周期
TimingFilter记录请求处理总耗时1(优先级最高)init(): 初始化计时器 → doFilter(): 记录开始/结束时间 → destroy(): 无特殊操作初始化时记录启动 → 请求时计算耗时 → 关闭时销毁 Filter 实例
CorsFilter设置跨域响应头(CORS)2(次之)init(): 初始化 → doFilter(): 设置响应头 → destroy(): 无特殊操作初始化时准备 CORS 配置 → 请求时设置响应头 → 关闭时销毁 Filter 实例

关键点总结
  1. Filter 链顺序控制

    • 通过 FilterRegistrationBean.setOrder() 设置优先级(数值越小优先级越高)。
    • 若未设置 setOrder(),默认按注册顺序执行。
  2. Filter 生命周期

    • init():Servlet 容器启动时调用一次,用于初始化资源。
    • doFilter():每个请求触发一次,处理请求/响应。
    • destroy():应用关闭时调用一次,用于释放资源。
  3. 典型应用场景

    • 日志记录:记录请求时间、路径、参数。
    • 安全验证:检查 Token、IP 白名单。
    • 性能监控:统计接口响应时间。

常见问题
  1. 如何动态调整 Filter 顺序?

    • 修改 FilterRegistrationBean.setOrder() 的数值,无需重启应用即可生效。
  2. 后置处理未执行怎么办?

    • 确保 doFilter() 方法中调用了 chain.doFilter(),否则链无法继续。
  3. 如何排除特定路径?

    • FilterRegistrationBean 中设置 excludeUrlPatterns(),或在 Filter 内部逻辑中判断路径。
http://www.dtcms.com/wzjs/229746.html

相关文章:

  • wordpress判断用户是否登录seo客服
  • wordpress保护原创百度网站排名优化软件
  • 企业网站建设熊掌号seo工具网站
  • 湖南响应式网站建设公司百度站长号购买
  • 外贸网站建设内容sem网站推广怎么做
  • wordpress 标签别名 id提升seo排名的方法
  • 陕西省建设监理协会网站成绩查询国内最新的新闻
  • 网站禁止右键复制代码sem推广
  • 电影频道做的网站广告搜索引擎优化实训
  • 怎么做天猫内部券网站企业网站怎么制作
  • 怎么做自己网站的APIseo关键词排名价格
  • 平面设计师是干啥的郑州网站seo外包公司
  • 做5g网站千锋教育培训机构怎么样
  • 深圳网站建设的费用my63777免费域名查询2023年
  • 做网站的流程是怎么样的长尾关键词爱站
  • 财经网站直播系统建设网站新域名查询
  • 潍坊外贸网站建设东莞疫情最新消息今天新增
  • 杭州本地网站网络推广和seo
  • 煎蛋网 wordpress百度seo新算法
  • frontpage网站模板下载广州网络营销
  • 企业网站建设的一般原则包括最有效的推广方式
  • 外贸网站推广建设近期新闻热点
  • 物流建设网站营销目标分为三个方面
  • web项目网站开发流程怎么写外链群发平台
  • 做网站 公司有哪些参考消息今天新闻
  • 笑话 语录用什么网站做深圳网页设计
  • 网站被降权表现营销网页
  • 做网站前没建images文件夹b站推广入口2023破解版
  • 做日本民宿的网站小程序开发工具
  • 新加坡政府网站建设拉人注册给佣金的app