AngularJS web.xml 用于 tomcat servlet 配置 <error-page>

AngularJS web.xml for tomcat servlet config <error-page>

目前,我们正在使用 tomcat servlet 部署 AngularJS webapp。 它使用位于 WEB-INF 目录中的标准 Web 应用程序部署描述符 web.xml。 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,您可以 "catch" 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了,不会激怒编码大神

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

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