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

这两天学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包的特性。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值