Struts2 死过一回,网站又活过来了。网站这不是网站什么秘密,但大多数人只记得它被 Apache 弃养的网站消息,忘了它其实还在银行、网站政务系统、网站老牌电商的网站深处跑着。我上个月帮一个朋友排查一个 2015 年上线的网站物流后台,那系统登录页右下角还写着 "Powered by Struts2",网站像块墓碑,网站可它每天还在处理几万单数据。网站
这框架的网站脾气,得摸透了才敢用。网站它不像 Spring Boot 那样把一切都收拾得整整齐齐,网站Struts2 的网站 Action 类就是普通 POJO,配置全堆在 struts.xml 里,一个不小心就能写出几百行的 XML 来。但你要是真把它理顺了——拦截器链、值栈、OGNL 表达式——那感觉就像骑一辆老式摩托车,档位清晰,油门响应直接,没有电子辅助的虚头巴脑。
最要命的是安全问题。S2-045、S2-046、S2-057,这些编号老程序员提起来都牙疼。2017 年那次大规模攻击,很多网站被用 Content-Type 头打穿,就是因为 OGNL 表达式能通过请求参数直接执行代码。我认识的一个运维大哥,那天半夜爬起来给三十多台服务器打补丁,一边打一边骂。但骂归骂,他手头那个项目至今没换框架——业务逻辑全绑死在 Action 链上了,迁移成本比重新开发还高。
Struts2 的标签库倒是被低估了。那种
社区里早就不怎么聊它了,Stack Overflow 上相关问题的回答还停留在 2018 年。但你去翻那些大企业的内部技术文档,Struts2 的配置片段还在被复制粘贴。这有点像 COBOL,不性感,但系统里到处是它。而且说实话,新版 Struts2 也学乖了,从 2.5 开始默认禁止了动态方法调用,OGNL 的访问权限也收紧了不少,只要规范写,没那么容易出洞。
我不劝人用它,也不劝人急着扔。技术选型这事儿,得看你的团队是哪种人——如果你有一帮能背出拦截器栈顺序的老伙计,Struts2 能给你极高的自由度;要是全是 Spring 系培养出来的新兵,那还是别碰了,他们会在 XML 和注解的混搭里迷路。
框架这东西,活着的方式有很多种。有的靠版本更新活着,有的靠一堆老系统的运维合同活着。Struts2 明显是后者。它像那种巷子深处开了二十年的修表铺,招牌旧了,但走时准,总有人推门进来。
