
存在struts
发帖时间:2026-10-17 04:38:49
存在struts
Struts还活着。不是那种博物馆里的活法,是那种你打开老项目的pom.xml,它突然跳出来给你一巴掌的活法。上个月帮朋友排查一个银行内部系统的崩溃问题,日志里满屏的`java.lang.NoSuchMethodError`,顺着堆栈往上摸,最后在`struts2-core-2.3.15.jar`里找到了答案。那是个2013年的版本,比我桌上那盆绿萝年轻不了多少。 说实话,我有点感动。一个框架被官方宣布EOL之后,还能在关键业务系统里稳如泰山地跑上十年,这本身就是种行为艺术。你问它为什么不升级?对方答曰:"升级要过等保测评,要重新走采购流程,要改四十多个配置文件。"然后他耸耸肩,"而且现在也没人懂这个了。" 没人懂,恰恰是Struts存在的另一种方式。它像老城区里那些没挂历史建筑牌子的骑楼,看着破旧,但底下全是商铺。有个做运维的朋友告诉我,他们公司每年做的"安全加固",其实就是拿脚本批量替换`ognl`相关的拦截器配置。没人知道为什么这么改能防住攻击,但改完就能过扫描。这套流程已经机械化了,像给佛像镀金,年年镀,年年掉。 我翻过一些老代码,Struts的XML配置里藏着很多前任程序员的叹息。比如某个action的`result`指向一个JSP,JSP里又嵌了Java代码,Java代码里又new了一个Service,Service里又调了另一个系统的HTTP接口。整条链路像藤蔓一样缠在一起,但确实能跑。跑得慢,但能跑。你没法说它是坏的,因为业务逻辑就是这套"坏"逻辑支撑起来的。 现在新项目谁还用Struts?Spring Boot写个`@RestController`三分钟出接口。但Struts教会了那代人一件事:约定优于配置之前,是配置优于一切。每个`struts.xml`里那几百行标签,都是当年程序员和框架搏斗后留下的伤疤。那些伤疤现在成了某种考古地层——`struts-default.xml`在最底下,上面压着自定义的拦截器栈,再上面是业务action,最表面那层是后来补丁打的`allowedMethods`白名单。 有个细节挺有意思。Struts的异常日志格式至今没变,还是那种带`[com.opensymphony.xwork2.interceptor.ParametersInterceptor]`前缀的写法。我在多个公司的日志系统里见过同样的格式,像某种接头暗号。看到这个前缀,你就知道这系统至少经历过2017年的S2-045、2018年的S2-057,或者更早的S2-003。它扛过了那么多波攻击,还倔强地打印着同样格式的日志,仿佛在说:你扫你的漏洞,我记我的参数。 当然,说它"存在",不全是怀旧。去年某个招聘平台的统计显示,Struts相关岗位的简历投递量比前年涨了17%。为什么?因为存量系统需要人维护,而会维护的人越来越少。物以稀为贵,这道理放在框架上也适用。有个猎头跟我说,现在能不看文档直接改`struts.xml`的候选人,开价能比同等年限的Spring程序员高30%。市场在用脚投票,投给那些愿意跟老代码共处的人。 Struts的存在,本质上是一种时间错位。当整个行业在聊云原生、Serverless时,它还在某个机房的WebLogic里处理着对公贷款申请。它不追赶什么,也不解释什么。就像你老家抽屉里那台诺基亚3310,电池早就鼓包了,但你偶尔想起它时,还是觉得它比现在的智能手机更像个"手机"。 Struts就是这么个东西。它不是技术选型,是地质层。你挖到哪一层,就说明这个系统活到哪个年代。而它还在那,安静地处理着请求,偶尔在凌晨的日志里吐出一串你认识或不认识的异常码。