作为Struts2开发的新手,我一直在努力解决这个问题,最近刚刚开始使用这个命名约定插件。
我正在尝试创建一个简单的网络应用程序,它最初只包含两个页面:
- 登录页面(
login.jsp
) - 主页(
home.jsp
)
首先,会向用户显示一个登录页面,如果提供了正确的用户名和密码,他们就会登录并重定向到主页。
我已经成功地创建了我的小型网络应用程序,写下了一个自定义登录拦截器,一切都很好,工作正常。如果用户尝试像http://myserver/homeAction
一样直接调用HomeAction
(如果您以前登录过,则会导致home.jsp
),我可以将用户重定向到登录页面。
当我尝试像这样直接访问JSP时,问题就来了:
http://myserver/home
当我使用这个Convention plugin
时,Struts获取我的home.jsp
插件并显示它。这不是我所期望的行为,因为home.jsp
应该只显示为loginAction
的成功结果。
我试图解决的问题
好吧,就我在谷歌上搜索的情况而言,将我的JSP放在/WEB-INF/
目录中应该可以防止它们被访问,但事实并非如此,因为我所有的JSP都在/WEB-INF/content/
中。
我尝试的另一件事是阻止对任何JSP
资源的访问(阻止*.JSP
请求)。只要您尝试访问myserver/home.jsp
,但在访问myserver/home
时失败(正如预期的那样),这就可以实现。
编辑:stackoverflow中还有一个关于这个问题的问题,但我无法理解答案:Struts2约定插件和WEB-INF 下的JSP文件
信息更新:我发现Struts2约定插件使用了一种名为";无行动结果";因此,您可以通过调用JSP
来访问WEB-INF/content
目录中的JSPs
,而不需要它的扩展,并且它将把它作为一个伪操作来处理,该操作在成功时返回JSP
。这是一个例子来说明我试图解释的内容:
如果我的WEB-INF/content
目录中有home.jsp
并调用http://myserver/home
;触发器";其结果将是CCD_ 24的动作。那么问题的解决方案将是禁用这个";"无行动";后果
如果没有人提供答案,我会在寻找解决方案的过程中不断更新这个问题。
以下是您想要禁用此功能的方式。
创建一个虚拟bean:
package com.struts.handler;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.Result;
import com.opensymphony.xwork2.UnknownHandler;
import com.opensymphony.xwork2.XWorkException;
import com.opensymphony.xwork2.config.entities.ActionConfig;
/**
* Created by Roman C on 22.03.2015.
*/
public class MyUnknownHandler implements UnknownHandler {
@Override
public ActionConfig handleUnknownAction(String namespace, String actionName) throws XWorkException {
return null;
}
@Override
public Result handleUnknownResult(ActionContext actionContext, String actionName, ActionConfig actionConfig, String resultCode) throws XWorkException {
return null;
}
@Override
public Object handleUnknownActionMethod(Object action, String methodName) throws NoSuchMethodException {
return null;
}
}
然后在struts.xml
:中进行配置
<bean type="com.opensymphony.xwork2.UnknownHandler" name="handler" class="com.struts.handler.MyUnknownHandler"/>
<unknown-handler-stack>
<unknown-handler-ref name="handler"/>
</unknown-handler-stack>
此处解释:
上面提到的约定插件及其创建的配置还放置了一个未知处理程序,该处理程序应该处理不存在配置的URL(即,不由约定创建)。这就是问题的根源。
现在放置您自己的处理程序将禁用约定的处理程序。因此,它将不再按惯例处理结果。