使用Struts2约定插件时,即使未定义hello-world.action
,插件也会自动将/WEB-INF/content/hello-world.jsp
请求转发给HelloWorld.java
。
请参阅http://struts.apache.org/release/2.1.x/docs/convention-plugin.html。
另一方面,我们将JSP文件放在WEB-INF下,以避免直接访问JSP文件。
我认为约定插件的这种行为破坏了JSP访问策略。任何人都可以通过简单地调用a,即时构建,动作来直接访问JSP。
我说错了吗?!如果是,我们可以禁用此功能吗?
答案 0 :(得分:2)
不,你不太正确。如果页面位于WEB-INF
下,则页面无法直接访问。约定插件按照约定从Action
类创建基于XML的配置。因此,您只能访问这些操作返回的结果。约定插件将其配置放在XWork包下,如文档和this答案中所述。因此,解决冲突,如果您未指定父包,则可能会发生冲突。您还可以使用约定注释来自定义生成的配置。默认情况下,约定插件会扫描基础包下的类,这些类可以是struts
或actions
,可配置且后缀为Action
。这些都是常规插件的默认配置。如果您想更改默认设置,可以使用struts.xml
中的常量标记或struts.properties
中的相应属性。
但是,文档不清楚如何处理
由URL 标识的无操作结果
此外,还不清楚用于识别它的URL。我认为您已经熟悉无操作配置,您可以在不执行操作的情况下返回结果SUCCESS,因为默认情况下使用操作类。但是,问题甚至不在这里。约定插件以及它上面提到的配置也放置了一个未知的处理程序,它应该处理配置不存在的URL(即不是由约定创建的)。这是问题的根源。该插件也不允许替换/覆盖配置。令人高兴的是,有一个未知的处理程序管理器(如果需要可以替换),它通过"unknown-handler-stack"
的迭代处理未知操作,由该管理器管理。使用处理程序堆栈,您可以配置迭代未知处理程序的顺序。注意,循环在处理程序返回操作配置时结束。这意味着如果您创建自己的未知处理程序并在堆栈中设置顺序,则可以绕过约定处理程序