【问题标题】:AngularJS web.xml for tomcat servlet config <error-page>AngularJS web.xml 用于 tomcat servlet 配置 <error-page>
【发布时间】:2017-11-11 16:08:02
【问题描述】:

目前,我们正在使用 tomcat servlet 部署 AngularJS webapp。 它使用标准的 Web 应用程序部署描述符,web.xml 位于 WEB-INF 目录中。 webapp 内部直接处理 URL 映射和错误代码,因此我们不希望在找不到资源(特别是 REST 资源)时出现 404 错误代码。

我们已经能够但能够摆脱错误更改 404到200,这个解决方案不能100%说服我。

(错误页面的正常使用)

<error-page>
<error-code>404</error-code>
<location>/404.html</location>
</error-page>

(这个解决方案可以吗?)

<error-page>
<!--Every time 200 is used as error code we stray further from God's Light.-->
<error-code>200</error-code>
<location>/404.html</location>
</error-page>

这个解决方案是最合适的还是我们缺少什么?

【问题讨论】:

  • 您是在使用 JAX-RS 还是这是一个自制的 REST 应用程序?
  • 后端(Java 服务器)上的 JAX-RS 和前端使用 $http 组件的 AngularJS。前端.war文件中提到的这个web.xml。

标签: angularjs tomcat servlets deployment web.xml


【解决方案1】:

有两种方式来看待这个问题。对于 JAX-RS,您可以“捕捉” 404 并做您想做的事。基本上,对于一个相当现代的服务器(Wildfly、JBoss、Glassfish 等),您应该能够执行以下操作:

import javax.ws.rs.NotFoundException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

@Provider
public class NotFoundExceptionMapper implements ExceptionMapper<NotFoundException> {

    @Override
    public Response toResponse(NotFoundException exception) {

        return Response.status(Response.Status.OK)
                .entity("rest path not found" )
                .type(MediaType.TEXT_PLAIN_TYPE)
                .build();
    }
}

有关其他 Response.Status 代码,请参阅 this page

但我强烈认为,正如您的 web.xml 注释所表明的那样,这是错误的做法。如果我正在构建一个前端并且我调用了一个错误的 URL,我应该返回 404。也许我不应该像 web.xml 给你的那样得到 301(重定向)。但是得到 404 是一个真正的错误代码,应该这样对待。

我很抱歉这是 Angular 1 代码,但我的代码做了类似的事情:

var result = $http.post('http://some/url/goes/here');
result.success(function (data, status) {
    $scope.showForm = false;
    $state.go('somewhere_good');
});
result.error(function (data, status) {    
    if (status === 409) {
        // handle conflict error
    }
    if (status === 500) {
        // handle internal error
    }

    // etc.
});

这样你就可以直接在前端处理 404 而不会激怒编码之神。

【讨论】:

  • 在过去的几周里,我正在研究 AngularJS 代码,或多或少是它的实现方式,我更新了解决这个问题的解决方案。我的困惑是单页应用程序和 servlet 都有错误代码,但问题更多与应用程序的第一次加载有关。
【解决方案2】:

错误代码与第一个请求有关,使用过滤器解决了这个 404 问题。下图更能说明问题:

过滤器只工作一次,因为一旦加载了应用程序,对于这种情况,servlet 就不再有请求了。加载到客户端 (5) 后,它会像普通 Angular 应用程序一样处理错误代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 2012-09-23
    • 1970-01-01
    • 2012-11-07
    • 2011-11-24
    • 1970-01-01
    相关资源
    最近更新 更多