目前,我们正在使用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>
这个解决方案是最合适的还是我们缺少的?
答案 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)