您的位置:首页 > 移动开发

Struts2的2.5版本异常There is no Action mapped for namespace[/] and action name []

2018-02-12 17:26 459 查看
这两天学maven时遇到了一个另我怀疑人生的bug。那就是访问action的方法时提示
There is no Action mapped for namespace[/] and action name []
的错误信息。我检查了
struts.xml
的文件名、存放的位置(
src下
),
继承的package为struts-default
。完全找不到是因为自己的配置出的错,莫名其妙。

首先我说一下我的错误原因。因为学习maven,于是本着什么东西都是高版本的好的思想,jdk要配置1.8的,什么jar包都去中央仓库找最新版本的坐标,没曾想使用
struts2.5版本
的jar导致我困惑了将近两天时间。下面进去正题。

首先表态一句,当你百度半天都找不到原因的时候,
官网的reference
真的是个好东西,英文单词生词并没有我想像的那么生僻,实在英语差的同学也可以下载火狐的
翻译侠
插件,选中单词即可翻译。下面贴一段
struts2的官方2.5版本
Version Notes
也就是新特性和改版。

Internal Changes

New security option was added - Strict Method Invocation
(also known as Strict DMI), see WW-4540


Struts 2 already supports Strict DMI but it's disabled by
default.Strict DMI should be always enable to allow access
only specific methods.


由上述可知,
struts2从Version2.5开始增加了严格的DMI机制
。在version2.5的struts核心包中,struts-default.xml的末尾有这么一行代码:

<global-allowed-methods>
execute,input,back,cancel,browse,save,delete,list,index
</global-allowed-methods>


使用log4j日志中在截获请求URL并准备执行对应方法时也会有

Defined allowed methods: [LiteralAllowedMethod{allowedMethod='cancel'},
LiteralAllowedMethod{allowedMethod='input'},
LiteralAllowedMethod{allowedMethod='save'},
LiteralAllowedMethod{allowedMethod='back'},
LiteralAllowedMethod{allowedMethod='index'},
LiteralAllowedMethod{allowedMethod='list'},
LiteralAllowedMethod{allowedMethod='execute'},
LiteralAllowedMethod{allowedMethod='delete'},
LiteralAllowedMethod{allowedMethod='browse'}]


通俗来说就是从version2.5以后,struts2的请求URL默认只能访问action中的方法名在
cancel、input、save、back、index、list、execute、delete、browse
之中的方法。否则就抛404异常。回想一下,以前用户请求的URL如果与你的action和action的方法不匹配似乎是返回struts2的错误模板页面。这样做的目的可能是规范请求URL,提高安全性和规则标准性。

那小伙伴可能就不舒服了,我之前随意定义action的方法名习惯了,不想改怎么办?当然了,这个改版并没有那么死板,默认情况下方法名只能是以上的,你想定义额外的可以在struts.xml中配置类似

<global-allowed-methods>
findAll,update,add,save
</global-allowed-methods>


的全局可访问方法名,但这个操作不是覆盖而是增量,即在默认的基础上增加方法名。同样也支持在你的 action 上使用 @AllowedMethods 注解,不过这个注解对应的具体版本还需要到官网上找,但最新版本肯定是支持的。

那我还想沿用之前的通配符匹配action和action_method的方式,那岂不是很麻烦?

这个问题可以通过正则匹配所有方法名来解决:

<allowed-methods>regex:.*</allowed-methods>


所以说啊,我这两天没有白痛苦。至少我明白了一下几个点:

1、第三方框架、工具并不是用更高的版本更好,在用它之前你得先熟悉它,不然他的该本颠覆了你之前的认知那会很头疼的,像我,就被这个bug卡了两天。

2、不要百度、知乎提问什么的。直接去官网看reference,那是最权威的,也能锻炼你的编程逻辑思维。里面介绍了技术的使用、技术的形成、为什么要这么用,这么用有什么好处。

3、要持之以恒,这两天我的内心是崩溃的,这么个小问题卡了我这么久,一度想放弃。好在我坚持下来了。累了你可以休息,但千万不要放弃。

4、要缕清排错思维,不能毫无头绪的东改改西查查,先确认具体是哪一块,再去精准定位。比如是不是环境不对、是不是配置文件写错了、是不是访问路径不对。如果不是自身问题,那一定是环境问题,比如jar包有没有导、版本有没有冲突的、再就是我今天提到的高版本jar包的特性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐