6

我有一个应用程序,它使用该功能为带有一些错误状态代码的 html 页面提供服务,例如 404。但是,有些请求是诸如 restful 服务或图像之类的东西,它们应该返回由 restful 服务提供的 JSON,或者什么都没有图像的情况。我使用 Tomcat 作为 servlet 容器。

澄清一下,有几个 servlet,其中一些提供图像,另一些提供 html,以及一个过滤器,为用户可以配置的各种路径提供 html。404 状态通常来自缺少映射到请求路径的过滤器或 servlet。因此,错误页面功能可以方便地为没有过滤器或 servlet 响应它们的路径提供响应。

所以我在 web.xml 中的内容是(忽略 / 和 * 之间的空格):

... several other mappings above

<servlet-mapping>
  <servlet-name>RestServlet</servlet-name>
  <url-pattern>/servlet/rest/ *</url-pattern>
</servlet-mapping>

<servlet-mapping>
  <servlet-name>ErrorPageServlet</servlet-name>
  <url-pattern>/servlet/errorPage/ *</url-pattern>
</servlet-mapping>

...

<filter-mapping>
  <!--This will serve content and not forward to the filter chain for certain paths-->
  <filter-name>MainFilter</filter-name>
  <url-pattern>/ *</url-pattern>
</filter-mapping>

...

<error-page>
  <!--Page not found-->
  <error-code>404</error-code>
  <location>/servlet/errorPage/404</location>
</error-page>

是否可以让错误页面 servlet 忽略某些请求,但在响应中为其他请求提供 html?或者我应该使用一些不同的方法来传递错误页面?

澄清一下,我想要的是,如果有人 GET /foo(它不存在)它会转到 ErrorPageServlet,但对于 GET /servlet/rest/foo/bar 返回 404 响应代码,它不会转到 ErrorPageServlet。

4

3 回答 3

6

我终于弄清楚了问题所在。宁静的服务正在调用HttpServletResponse.sendError()而不是HttpServletResponse.setStatus(). 事实证明,两者之间存在巨大差异,并且只会sendError()导致使用 servlet。

解决方法很简单,sendError()如果你想让错误页面处理输出就使用,setStatus()如果你想在当前servlet中写入输出就使用。

于 2013-11-08T15:33:48.937 回答
2

首先,您应该设置web.xml以将错误 404 重定向到特定页面:

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

此时,您可以按如下方式实现您的error404.jsp :

<%@ page language="java" isErrorPage="true" %><%  

    String url = (String) request.getAttribute("javax.servlet.forward.servlet_path") ;
    if ( url!=null && url.indexOf("restRequest")!=-1 ) return ; 

  %>
  <html><head><title>Error 404</title></head><body>Error 404<br>The requested URL <%=url%> was not found on this server.</body></html>
于 2013-11-07T12:25:22.700 回答
-1

您可以通过简单的 web.xml 映射来实现它。例子是

<servlet>
    <servlet-name>ExceptionServlet</servlet-name>
    <servlet-class>examples.Exception</servlet-class>
</servlet>

    <servlet-mapping>
        <servlet-name>ExceptionServlet</servlet-name>
        <url-pattern>/errorCodeRequest</url-pattern>
    </servlet-mapping>

   <servlet>
        <servlet-name>JsonServlet</servlet-name>
        <servlet-class>examples.JSON</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>JsonServlet</servlet-name>
        <url-pattern>/restRequest</url-pattern>
    </servlet-mapping>
于 2013-11-07T09:19:29.303 回答