遇到总结一下项目中有关Struts2升级中遇到的坑。项目大概开始于09年左右,维护近10年,由于Struts2安全漏洞问题决定升级版本,由于版本跨度比较大,一些方法已经弃用或配置变更等
Main Maven Dependency
1 | // old |
Struts2.xml
- old
1 | <filter> |
- new
1 | <filter> |
在Struts2 2.5.17中
org.apache.struts2.dispatcher.FilterDispatcher
和org.apache.struts2.dispatcher.ActionContextCleanUp
被废除,用org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
替换
升级过程中遇到的报错:
java.lang.NoSuchMethodError: ognl.SimpleNode.isEvalChain(Lognl/OgnlContext;)Z
- 问题:
ognl
的jar包冲突
需要查询项目中Jar依赖关系,排除无用Jar包。Ognl版本至少在3.0.6
以上
1 | // 我遇到的是xwork中有低版本的ognl包,故排除 |
There is no Action mapped for namespace [/] and action name [user!add] associated with context path
- 问题:由于2.5.17安全机制,过滤器必须指定mapped规则
- 粗粒度—动态方法调用
1 | // struts.xml配置添加 |
- 细粒度-动态方法调用
1 | // action配置 |
这里在action的name中通配了一个login_*,它对应映射的是method属性。如果在客户端发生一个这样的请 求:login_init.action、login_show.action等,这时服务器就会自动调用这个action中的init()方法或 show()方法。这里的method=”{1}”代表是第一个星号,如果有多个星号,就要根据顺序来通配{1},{2},{3}….
allowed-methods
中可以用逗号分隔指定方法名,也可以用正则匹配。
错误: Struts2 与 Servlet 冲突
表现在当struts.xml如下配置:
1 | <filter-mapping> |
struts拦截器会拦截/*下所有路径,所以自定义的servlet无法被mapped到,导致请求根本无法响应
解决方案如下:
- 修改servlet的相关配置,统一在servlet后面加上.servlet
1 | <servlet> |
- 修改拦截页面配置,就是将struts的相关拦截配置一下
1 | <filter-mapping> |
- 修改struts.xml文件中的后缀映射
1 | <constant name="struts.action.extension" value="action"></constant> |
转载请注明出处