【问题标题】:Struts2, best practice for using method={1}Struts2,使用method={1}的最佳实践
【发布时间】:2009-04-08 13:03:12
【问题描述】:

我是 Struts 2 的新手,遇到过这种语法(在教程中推荐)。

<action name="Register_*" method="{1}" class="Register">
    <result name="input">/member/Register.jsp</result>
    <result type="redirectAction">Menu</result>
</action>

我知道它调用了 Register.{1} 方法。问题是用户可以输入另一个(随机)值并导致 500 错误(这将被正确记录为错误)。

如何预防?

【问题讨论】:

    标签: java xml struts2 struts


    【解决方案1】:

    在我的应用程序中,我们这样使用它:

      <action name="*/*" class="{1}Action" method="{2}">
           <interceptor-ref name="CustomAuthStack" />       
                <result>/pages/{1}/{2}.jsp</result>
                <result name="input">/pages/error/denied.jsp</result>
                <result name="logout">/pages/error/denied.jsp</result>
    
                <!-- methods that come back to listing after processing -->
                <result name="remove" type="redirectAction">{1}/list</result>
                <result name="save"   type="redirectAction">{1}/list</result>
                <result name="enable"   type="redirectAction">{1}/list</result>
    
       ....
    
       </action>
    

    对于像 myapp/users/list 这样的斜杠,您必须使用

    启用斜杠
    <constant name="struts.enable.SlashesInActionNames" value="true" />
    

    在 strus.xml 中。

    所以现在你有了一个标准:

    动作 --> 用户动作 jsp -----> users/list.jsp

    等等

    【讨论】:

    • 这看起来不错,但对我不起作用,因为 Struts2 总是将斜杠前的 * 解释为命名空间,并将第二个 * 解释为目标操作。
    【解决方案2】:

    首先它不会调用 Register.{1} 方法。它会调用 Register_{1},其中 {1} 可能是一种操作类型(通常是编辑、显示等)

    表示网址实际上是

    Register_View
    Register_Edit
    e.t.c.
    

    因此,如果用户手动将 URL 更改为不存在的内容,例如

    Register_methodThatDoesNotExist
    

    那么struts 2会返回错误。

    但为什么这是个问题?在任何使用任何技术的 Web 应用程序中,如果用户手动篡改 URL,则会返回错误(也是 404)

    你到底想防止什么?

    更新:

    为防止出现 500 错误,您可以捕获所有操作(不匹配任何规则)并将它们重定向到错误页面中。 请参阅 struts 2 wiki 中的“Wildcard Default”默认段落

    http://cwiki.apache.org/WW/action-configuration.html

    这个必须在struts配置的末尾

    【讨论】:

    • Register_invalidMethod.action 返回 500 错误,而不是 404。 java.lang.NoSuchMethodException:Register.invalidMethod() 我想尝试防止任何“500”内部错误被类似无效的网址。我看不出如何在任何严肃的 Web 应用程序中使用这种语法。
    • 阅读更多关于 struts 文档中通配符的信息。有许多巧妙的技巧可以做很多事情,包括你想要的。
    • 问题是,它确实匹配第一个通配符,因此会出现 500 错误。您认为最好完全避免这种语法吗?
    • 只有当你有 4-5 种类型的操作(例如添加、查看、删除、存档、删除)时,通配符才有用。如果您有 1 或 2,那么您可以硬编码名称并避免使用通配符(并在底部使用全局规则捕获其他所有内容)。
    • 如果您真的担心,您还会在应用程序服务器级别捕获 500 个错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 2017-11-29
    • 2010-10-08
    • 2012-04-11
    • 2010-12-04
    • 1970-01-01
    相关资源
    最近更新 更多