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 应用程序一样处理错误代码。
目前,我们正在使用 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 问题。下图更能说明问题: