Struts 2 Convention插件和WEB-INF下的JSP文件

使用Struts2约定插件时,即使没有定义HelloWorld.java ,插件hello-world.action自动将hello-world.action请求转发到/WEB-INF/content/hello-world.jsp

请参阅http://struts.apache.org/release/2.1.x/docs/convention-plugin.html 。

另一方面,我们将JSP文件放在WEB-INF下以避免任何直接访问JSP文件。

我认为约定插件的这种行为破坏了JSP访问策略。 任何人都可以通过简单地调用a,即时构建,动作来直接访问JSP。

我对么?! 如果是,我们可以禁用此function吗?

不,你不太正确。 如果页面位于WEB-INF下,则页面无法直接访问。 约定插件按照约定从Action类创建基于XML的配置。 因此,您只能访问这些操作返回的结果。 约定插件将其配置放在XWork包下,如文档和本答案中所述。 因此,解决冲突,如果您未指定父包,则可能会发生冲突。 您还可以使用约定注释来自定义生成的配置。 默认情况下,约定插件会扫描基础包下的类,这些类可以是可配置且具有Action后缀的strutsactions 。 这些都是约定插件的默认配置。 如果您想更改默认设置,可以在struts.xml使用常量标记或在struts.properties使用相应的属性。

但是,文档并不清楚它是如何处理的

由URL标识的无动作结果

此外,还不清楚用于识别它的URL。 我认为您已经熟悉无操作配置,您可以在不执行操作的情况下返回结果SUCCESS,因为默认情况下使用操作类。 但是,问题甚至不在这里。 约定插件以及它上面提到的配置也放置了一个未知的处理程序,它应该处理配置不存在的URL(即不是由约定创建的)。 这是问题的根源。 该插件也不允许替换/覆盖配置。 令人高兴的是,有一个未知的处理程序管理器(可以在需要时替换它)通过迭代"unknown-handler-stack"处理未知操作,该管理器由该管理器管理。 使用处理程序堆栈,您可以配置迭代未知处理程序的顺序。 注意,循环在处理程序返回动作配置时结束。 这意味着如果您创建自己的未知处理程序并在堆栈中设置顺序,则可以绕过约定处理程序。