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

标签 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>

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

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

最佳答案

我终于明白是什么问题了。 Restful 服务正在调用 HttpServletResponse.sendError() 而不是 HttpServletResponse.setStatus()。事实证明,两者之间存在巨大差异,只有 sendError() 会导致使用 servlet。

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

关于java - 是否可以让 <error-page> servlet 忽略某些请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19831923/

相关文章:

java - 将多个标记添加到谷歌地图并缩放以包含所有标记

java - 代码设计 : self resetting boolean. 反对的原因是什么?

java - Eclipse使用gradle项目时出现错误

java - 我的 API REST 和我的网站/脚本之间的安全连接

java - Jersey REST 客户端 - 多部分创建 - 不是来自 File 对象

java - 从迭代 ArrayList 内部删除对象的最有效方法

c - C 中的 REST 客户端库

spring - 如何将带有 angular 2 前端(angular-cli 构建)的 spring-boot webapp 部署到 Tomcat?

tomcat - 我们如何在 TOMCAT 中生成堆栈跟踪?

java - Tomcat - 请求的资源 () 不可用。什么会导致 .war 文件不显示/加载?