我有一个应用程序使用该功能来提供带有一些错误状态代码的html页面,例如404.但是有些请求是宁静的服务或图像,应该返回由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?或者我应该使用一些不同的方法来传递错误页面?
为了澄清,我想要的是,如果有人GETs / foo(不存在)它会转到ErrorPageServlet,但是对于GET / servlet / rest / foo / bar返回404响应代码它不会去ErrorPageServlet。
答案 0 :(得分:4)
我终于找到了问题所在。宁静的服务是调用HttpServletResponse.sendError()
而不是HttpServletResponse.setStatus()
。事实证明两者之间存在巨大差异,只有sendError()
导致使用servlet。
解决方案很简单,如果希望错误页面处理输出,请使用sendError()
,如果要在当前servlet中编写输出,请使用setStatus()
。
答案 1 :(得分: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>
答案 2 :(得分:-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>