
Struts 2 本身不原生支持 REST 风格的路径参数(如 /save-user.action/name/joe/age/20),但可通过前置 URL 重写过滤器(如 Tuckey URLRewriteFilter)将路径格式转换为标准查询参数格式,再交由 Struts 2 Convention 插件正常处理。
struts 2 本身不原生支持 rest 风格的路径参数(如 `/save-user.action/name/joe/age/20`),但可通过前置 url 重写过滤器(如 tuckey urlrewritefilter)将路径格式转换为标准查询参数格式,再交由 struts 2 convention 插件正常处理。
在 Struts 6.2(兼容 Struts 2.x 约定插件行为)与 Tomcat 9 的环境中,.action 后缀已能正确路由至对应 Action,但默认无法解析嵌入式路径参数(path variables)——例如 save-user.action/name/joe/age/20 中的 name 和 age 并不会自动绑定到 Action 属性。这是因为 Struts 2 的拦截器链在接收到请求时,仅解析 ?key=value 形式的查询参数,而将 /name/joe/age/20 视为静态路径片段。
✅ 推荐解决方案:引入 Tuckey URLRewriteFilter 做前置重写
该 Filter 需部署在 Struts2 FilterDispatcher(或 Struts 6 中的 StrutsPrepareAndExecuteFilter)之前,在请求进入 Struts 处理流程前完成 URL 标准化。
步骤如下:
-
添加依赖(Maven)
<dependency><groupid>org.tuckey</groupid><artifactid>urlrewritefilter</artifactid><version>4.0.4</version></dependency>
-
配置 web.xml(注意 filter 顺序)
<!-- URLRewriteFilter 必须在 Struts Filter 之前 --> <filter><filter-name>UrlRewriteFilter</filter-name><filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class></filter><filter-mapping><filter-name>UrlRewriteFilter</filter-name><url-pattern>/*</url-pattern><dispatcher>REQUEST</dispatcher><dispatcher>FORWARD</dispatcher></filter-mapping>
-
编写 WEB-INF/urlrewrite.xml 规则文件
支持正则匹配与动态捕获,适配多段路径参数:<?xml version="1.0" encoding="UTF-8"?>
⚠️ 注意事项:
- 正则中需对点号 . 进行转义(\.),避免误匹配;
- 使用 type="forward" 可保持请求内部转发,不改变浏览器地址栏;若需重定向,改用 type="redirect";
- 多层嵌套参数建议优先采用明确规则(如第一例),避免过度泛化的正则导致歧义或性能损耗;
- Struts Action 类中仍需定义对应 setter 方法(如 setName(String)、setAge(int)),Convention 插件会自动完成 OGNL 绑定。
✅ 验证效果
请求 http://localhost:8080/app/save-user.action/name/joe/age/20 将被重写为 http://localhost:8080/app/save-user.action?name=joe&age=20,随后 Struts 2 正常注入参数并执行 SaveUserAction.execute()。
此方案无需修改 Struts 源码或自定义拦截器,兼容性强、配置清晰,是 Struts 生态下处理类 REST 路径参数的成熟实践。









