日期:2014-05-17  浏览次数:21208 次

struts2namespace导致的循环请求问题(url/user/user/user/login.do)
最近在用struts2搭建一个框架,快收尾的时候突然发现一个奇怪的问题,描述如下:
struts.xml定义

<struts>
<constant name="struts.devMode" value="false" />
<constant name="struts.action.extension" value="do," />
<package name="user" extends="struts-default" namespace="/user">
<action name="login" class="com.struts.action.UserAction" method="login">
<result name="success">/WEB-INF/pages/login.jsp</result>
</action>
</package>
</struts>

跳转到login页面的方法不贴了,直接return SUCCESS的。web.xml也是除了设置struts2的监听器没有干别的。
在struts.xml里面配置了一个namespace="user"的package,然后发现每次请求的时候使用http://localhost:8080/user/login.do是可以正常进入result指向的页面的。
BUT,我发现使用http://localhost:8080/user/user/user/user/login.do也可以进入!居然没有报404错误。而且中间的user是几个不影响。清除浏览器缓存,重新发布,清楚tomcat的目录...发现始终不出现我想要的404错误。

后台又仔细研究了一下,发现更可怕的来了,中间原来可以放任何东西,都不影响,只要格式如http://localhsot:8080/user/这里可以放任何东西/login.do都能正常显示登录页面。

我看了一下struts2的版本,用的是2.3.16.1,为了排除问题,用myeclipse自带的2.1试了一下,终于不出这个问题了,成功出现404。

现在问题来了,我上面描述的问题是新版struts2的新特性吗?能否把它关掉?我感觉这个会造成更难搞的问题,如上下文相对路径的问题,而且项目也接近尾声了,突然换框架担心遇到别的问题。

希望各位大神不吝赐教,在这里先谢过了。
------解决方案--------------------
添加这句貌似可以<constant name="struts.mapper.alwaysSelectFullNamespace" value="true"/>
在我这做了简单的测试可以诶,不知道在你那能行不?