用于tomcat servlet config的AngularJS web.xml <error-page>

时间:2017-06-09 15:09:11

标签: angularjs tomcat servlets deployment web.xml

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

我们能够摆脱错误的变化 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>

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

2 个答案:

答案 0 :(得分:-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,而不是激怒编码之神。

答案 1 :(得分:-1)

错误代码与第一个请求相关,使用过滤器解决了这个404问题。以下图片更好地阐明了它:

enter image description here 过滤器只能运行一次,因为一旦加载了应用程序,对于这种情况,不再对servlet进行任何请求。在将其加载到客户端(5)之后,它会像正常的Angular应用程序那样处理错误代码。