【问题标题】:Struts 2 custom 404 error page never showsStruts 2 自定义 404 错误页面从不显示
【发布时间】:2014-07-29 03:53:33
【问题描述】:

我正在将 Struts 2 框架用于 web 应用程序。在尝试创建自定义 404 错误页面时,我发现 Struts 2 为我做的工作比预期的要多。

我只使用struts.xml 和web.xml 文件。在web.xml 文件中,我添加了以下代码:

<error-page>
    <error-code>404</error-code>
    <location>/error/Error404.jsp</location>
</error-page>

现在,当我启动我的 web 应用程序时,它会像往常一样进入主页。当我尝试这种类型的网址时(所有不存在的网址):

http://localhost:8080/MyWebApp/fhgfhfhfhgfhgfhfhfh
http://localhost:8080/MyWebApp/fhgfhfhfhgfhgfhfhfh.action

Struts 将处理请求,运行拦截器,并自动重定向到默认页面。我本来希望我的 404 错误页面会显示在这些页面上。我什至在struts.xml 中删除了这一行,但它仍然会重定向!

<default-action-ref name="index" />

当我使用以下网址时:

http://localhost:8080/MyWebApp/fhgfhfhfhgfhgfhfhfh.jsp

Struts 只是显示一个空白屏幕,并且没有处理任何请求(没有拦截器,没有重定向......)。我也觉得这很奇怪,因为我看不到该请求的无效之处(除了不存在的 JSP 文件)

所以我想我需要修改我的struts.xml,以便我可以覆盖一些默认的重定向行为(我不希望通过访问主页来掩盖 404 错误),并且我的web.xml 也可以处理任何任意模糊的请求(因此用户输入的任何 URL 都将被实际处理,而不仅仅是显示空白屏幕。我的配置中缺少什么?

PS:我不是在谈论 Java 异常/错误,而只是在谈论 HTTP 错误。 Java 异常得到了正确的处理,就像我希望它们的行为一样。

【问题讨论】:

    标签: jsp struts2 http-status-code-404 web.xml


    【解决方案1】:

    Struts 2 也可以配置为处理未知的操作或结果,即使没有default-action-ref 标签,它也提供了处理此类请求的配置。

    通常您可以通过struts2 xml 配置和引用处理程序使用unknown-handler-stack 标记。您应该检查是否提供了 com.opensymphony.xwork2.UnknownHandler。另请参阅此答案How to define unknown handler bean。

    如果您使用的是默认提供的约定插件 convention 未知处理程序,它可能会处理您的操作或结果。

    【讨论】:

    • 这非常有用,我实现了这个以防万一。不幸的是,它不适用于服务器上的资源,例如“myWebApp/afile.zip”。如果我去那个 url,我会得到我的浏览器的 404 页面。
    • 这个资源存在吗?
    【解决方案2】:

    我找到了它没有显示的原因。

    黑屏问题如下:我的404页面路径不正确。它应该是从 webContent 文件夹开始的路径,并以斜杠“/”开头。

    默认操作的问题可能是服务器重新启动或缓存问题。我关闭了浏览器和 IDE,然后重新启动了一切。然后 default-action-ref 真的消失了。

    我还发现了另一个有趣的怪癖:struts2 只处理动作映射,例如:

    http://www.mywebsite.com/webapp/whatever
    http://www.mywebsite.com/webapp/whatever.action
    

    但它不会像这样处理服务器资源(注意文件扩展名)

    http://www.mywebsite.com/webapp/whatever.zip
    http://www.mywebsite.com/webapp/whatever.jsp
    http://www.mywebsite.com/webapp/whatever.html
    

    您可以通过在 web.xml 文件中添加额外的过滤器映射来解决此问题:

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/error/*</url-pattern>
        <dispatcher>ERROR</dispatcher>
    </filter-mapping>
    

    【讨论】:

    • 注意并记录这个为错误添加过滤器映射的有趣怪癖
    【解决方案3】:

    要解决这个问题,您可以简单地添加默认命名空间并创建一个引用为 * 的操作。如果没有匹配的动作,它将默认执行。将以下代码添加到 struts.xml。它应该可以正常工作。

    <package name="serveAll" namespace="" extends="struts-default">
            <action name="*">
                <result>/error.jsp</result>
            </action>
    </package>
    

    【讨论】:

    • 这是一个不错的技巧,我肯定会在其他情况下充分利用它。不幸的是,它不适用于服务器上的资源,例如“myWebApp/afile.zip”。如果我去那个 url,我会得到我的浏览器的 404 页面。
    • 它也应该与 .zip 一起使用。我测试过。不仅是 .zip,即使我们输入 .asdasd,它也会响应错误页面。有关信息,请参阅tech.learnerandtutor.com/struts2-tutorial-part-5-namespaces。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 2019-09-14
    • 2016-04-25
    • 2013-09-16
    • 2013-09-12
    相关资源
    最近更新 更多