是否可以使<error-page> servlet忽略某些请求?

Sin*_*son 4 java rest tomcat servlets

我有一个应用程序,使用该功能为带有某些错误状态代码(例如404)的html页面提供服务。但是,某些请求是诸如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>
Run Code Online (Sandbox Code Playgroud)

是否可以使错误页面servlet忽略某些请求,但在响应中提供html的请求呢?还是应该使用其他方法来传递错误页面?

为了澄清,我想要的是,如果有人GETs / foo(不存在)进入ErrorPageServlet,但是对于GET / servlet / rest / foo / bar返回404响应代码,则不会进入ErrorPageServlet。

Sin*_*son 5

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

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


M S*_*ach -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>
Run Code Online (Sandbox Code Playgroud)