【问题标题】:Struts 2 Convention Plugin and JSP files under WEB-INFWEB-INF下的Struts 2 Convention Plugin和JSP文件
【发布时间】:2014-01-14 22:05:15
【问题描述】:

使用 Struts2 约定插件时,即使没有定义 HelloWorld.java,插件也会自动将 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 访问策略。任何人都可以通过简单地调用动态构建操作来直接访问 JSP。

我说的对吗?!如果是,我们可以禁用此功能吗?

【问题讨论】:

    标签: java jsp configuration struts2 struts2-convention-plugin


    【解决方案1】:

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

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

    无操作由 URL 标识的结果

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

    【讨论】:

    • 我已经查看了您的答案和链接,很遗憾我没有得到答案。根据示例,hello-world.jsp 是操作的结果,但它仍然是一个可以访问的 jsp。顺便问一下,是否可以将约定插件配置为在调用 hello-world.action 时不显示 hello-world.jsp(即使它是有效结果)!谢谢。
    • hello-world 操作返回由基于包的配置器配置的结果。因此,在execute 中,您可以返回任何结果。查看更新的答案。
    • 您好,很抱歉再次提出这个问题,但我正在努力解决与 OP 相同的问题,我无法弄清楚如何从 Struts2 约定插件中禁用此actionless results,或处理它们防止直接访问我的JSP 文件。 @RomanC我知道你在stackoverflow上仍然很活跃所以请你能更好地解释你的答案吗?我在同一件事上在这里创建了一个提示:stackoverflow.com/questions/29185042/…。提前致谢
    猜你喜欢
    • 1970-01-01
    • 2012-12-30
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    相关资源
    最近更新 更多