首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Tomcat -当应用程序没有正确部署时,如何获得http 500而不是404?

Tomcat -当应用程序没有正确部署时,如何获得http 500而不是404?
EN

Stack Overflow用户
提问于 2012-05-15 03:32:23
回答 2查看 1.7K关注 0票数 3

我们有几个使用Spring MVC的REST应用程序。部署后某些应用程序未启动的时间。当我们的Javascript客户端尝试访问资源url时,它会得到404状态代码。因此,它假设该资源不存在。更适合我们的是在Tomcat响应中返回的http状态500。有可能改变这个默认的Tomcat行为吗?

我在JBoss (使用嵌入式Tomcat)中也发现了类似的问题,但没有答案:https://serverfault.com/questions/367986/mod-jk-fails-to-detect-error-state-because-jboss-gives-404-not-500

EN

回答 2

Stack Overflow用户

发布于 2012-05-15 04:06:24

HTTP代理

如果您的Tomcat服务器前面有某种类型的代理(如apachenginx),我相信它可以配置为将404转换为不同的状态代码和错误页面。如果您没有任何代理或希望解决方案保持自包含:

自定义Spring加载器和servlet过滤器

因为您使用的是Spring,所以我猜您是在web.xml中使用ContextLoaderListener引导它

代码语言:javascript
运行
复制
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

这个类负责引导Spring,这是在大多数情况下导致应用程序启动失败的步骤。只需扩展类并接受任何异常,这样它就永远不会到达servlet容器,因此Tomcat不会认为您应用程序部署失败:

代码语言:javascript
运行
复制
public class FailSafeLoaderListener extends ContextLoaderListener {

    private static final Logger log = LoggerFactory.getLogger(FailSafeLoaderListener.class);

    @Override
    public void contextInitialized(ServletContextEvent event) {
        try {
            super.contextInitialized(event);
        } catch (Exception e) {
            log.error("", e);
            event.getServletContext().setAttribute("deployException", e);
        }
    }
}

代码非常简单-如果Spring初始化失败,记录异常并将其全局存储在ServletContext中。新的加载器必须替换web.xml中的旧加载器

代码语言:javascript
运行
复制
<listener>
    <listener-class>com.blogspot.nurkiewicz.download.FailSafeLoaderListener</listener-class>
</listener>

现在,您所要做的就是在全局过滤器中从servlet上下文中读取该属性,并在应用程序无法启动Spring时拒绝所有请求:

代码语言:javascript
运行
复制
public class FailSafeFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}

    @Override
    public void destroy() {}

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        Exception deployException = (Exception) request.getServletContext().getAttribute("deployException");
        if (deployException == null) {
            chain.doFilter(request, response);
        } else {
            ((HttpServletResponse) response).sendError(500, deployException.toString());
        }
    }
}

将此过滤器映射到所有请求(或者可能只有控制器?):

代码语言:javascript
运行
复制
<filter-mapping>
    <filter-name>failSafeFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

解决方案可能不是你想要的,但我给你一个通用的,有效的例子。

票数 0
EN

Stack Overflow用户

发布于 2016-04-23 21:25:30

是的,这是可能的,但需要一些改变。

我们做的事情:

  • 编写一个servlet,它执行以下操作:

if (req.getContextPath().isEmpty()){ resp.setStatus(HttpServletResponse.SC_SERVICE_UNAVAILABLE);} else { resp.setStatus(HttpServletResponse.SC_NOT_FOUND);} servlet将包含此类的jar放入tomcat lib.

  • 以添加servlet并将其映射到*.404

  • set全局错误404/404.404

404 /404.404

根应用程序和所有已部署的应用程序都将调用您的servlet。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10589871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档