Java Tomcat—当应用程序不可用时,如何获得http 500而不是404';部署不正确?
我们有几个使用SpringMVC的REST应用程序。有时,部署后的某些应用程序无法启动。当我们的Javascript客户端尝试访问资源url时,它会得到404状态代码。因此,它假设该资源不存在。更适合我们的是Tomcat响应中返回的http状态500。是否可以更改此默认Tomcat行为 我发现JBoss(使用嵌入式Tomcat)也存在类似的问题,但没有答案: HTTP代理 如果您的Tomcat服务器前面有某种代理(如或),我相信可以将其配置为将404转换为不同的状态代码和错误页面。如果您没有任何代理或希望解决方案保持独立: 自定义Spring加载程序和servlet过滤器 因为您使用的是Spring,所以我猜您是在Java Tomcat—当应用程序不可用时,如何获得http 500而不是404';部署不正确?,java,tomcat,deployment,http-status-codes,apache,nginx,Java,Tomcat,Deployment,Http Status Codes,Apache,Nginx,我们有几个使用SpringMVC的REST应用程序。有时,部署后的某些应用程序无法启动。当我们的Javascript客户端尝试访问资源url时,它会得到404状态代码。因此,它假设该资源不存在。更适合我们的是Tomcat响应中返回的http状态500。是否可以更改此默认Tomcat行为 我发现JBoss(使用嵌入式Tomcat)也存在类似的问题,但没有答案: HTTP代理 如果您的Tomcat服务器前面有某种代理(如或),我相信可以将其配置为将404转换为不同的状态代码和错误页面。如果您没有任何
web.xml
中引导它:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>com.blogspot.nurkiewicz.download.FailSafeLoaderListener</listener-class>
</listener>
代码非常简单-如果Spring初始化失败,记录异常并将其全局存储在ServletContext
中。新加载程序必须替换web.xml
中的旧加载程序:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>com.blogspot.nurkiewicz.download.FailSafeLoaderListener</listener-class>
</listener>
将此筛选器映射到所有请求(或者可能仅映射到控制器):
故障保护过滤器
/*
这个解决方案可能不是您想要的,但我给您一个通用的、有效的示例。是的,经过一些更改,这是可能的 我们的工作:
- 编写一个servlet,执行以下操作:
if (req.getContextPath().isEmpty()){ resp.setStatus(HttpServletResponse.SC_SERVICE_UNAVAILABLE); } else { resp.setStatus(HttpServletResponse.SC_NOT_FOUND); }
- 将包含此类的jar放入tomcat库
- 更改conf/web.xml以添加servlet并将其映射到
*.404
- 将全局错误
设置为404
/404.404
<error-page> <error-code>404</error-code> <location>/404.404</location> </error-page>
404 /404.404
您的servlet将被根应用程序和所有部署的应用程序调用。感谢您的回复,但我们希望在Tomcat级别解决它,但我不知道是否可能。。。例如,Jetty在出现此类错误时返回503。与其尝试更改用户看到的状态代码,还不如确定部署失败的来源更有帮助吗?
<error-page>
<error-code>404</error-code>
<location>/404.404</location>
</error-page>