【问题标题】:Custom 404 using Spring DispatcherServlet使用 Spring DispatcherServlet 自定义 404
【发布时间】:2010-11-14 20:35:10
【问题描述】:

我已将 web.xml 设置如下。我还有一个基于注释的控制器,它接受任何 URL 模式,然后转到相应的 jsp(我已经在 -servlet.xml 中设置了它)。但是,如果我转到以 .html 结尾的页面(并且其 jsp 不存在),我看不到自定义 404 页面(并在日志中看到以下错误)。任何不以 .html 结尾的页面,我都可以看到自定义 404 页面。

如何为通过 DispatcherServlet 的任何页面配置自定义 404 页面?

还想补充一点,如果我将错误页面设置为静态页面(即error.htm),它可以工作,但如果我将其更改为jsp(即error.jsp),我会得到IllegalStateException。任何帮助将不胜感激。

日志错误

Caused by: java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.catalina.connector.Response.getWriter(Response.java:606)
at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:195)
at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:124)

控制器

@RequestMapping(value = {"/**"})

public ModelAndView test() {

    ModelAndView modelAndView = new ModelAndView();

    return modelAndView;
}

web.xml

<servlet>
 <servlet-name>my_servlet</servlet-name>
 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>

...

<servlet-mapping>
    <servlet-name>my_servlet</servlet-name>
    <url-pattern>*.html</url-pattern>
</servlet-mapping>

...

<error-page>
    <error-code>404</error-code>
    <location>/error.html</location>
</error-page>

【问题讨论】:

标签: spring annotations http-status-code-404 web.xml


【解决方案1】:

一种选择是通过调度程序 servlet 映射所有错误页面。

创建一个新的 HTTP 错误控制器:


@Controller
public class HTTPErrorController {

    @RequestMapping(value="/errors/404.html")
    public String handle404() {
        return "errorPageTemplate";
    }

    @RequestMapping(value="/errors/403.html")
    ...

}

在 web.xml 中映射错误页面

<error-page>
    <error-code>404</error-code>
    <location>/errors/404.html</location>
</error-page>

【讨论】:

  • @Stefan Haberl,为什么要更改 @Rob 的帖子,而不是将您的简化版本发布为新答案?
  • 谁能验证这个解决方案是否有效?它不适合我(春季 3.0.5)
  • 这个代码示例几乎是来自我们的一些应用程序的逐字记录,并且按预期工作。你有什么问题?我可以帮忙调试。
  • @Andreas 请求会到达那里,因为您将它映射到 servlet 层的 web.xml 中。 servlet 会将您的 404 映射到 /errors/404.html,然后 Spring Controller 将能够赶上它。 Controller 对此一无所知,它是 404,只会得到匹配的请求映射,servlet 不知道它会将错误拉到 Spring,只会重定向到恰好映射到 Spring 控制器的网址。跨度>
  • 我实现了这个解决方案,但它导致我们的日志中出现错误,显示“找不到 URI 的映射...”
猜你喜欢
  • 1970-01-01
  • 2013-09-21
  • 2019-05-12
  • 1970-01-01
  • 2014-11-30
  • 2014-09-28
  • 2015-11-06
  • 2021-10-15
相关资源
最近更新 更多