依靠CORS处理JavaEE7服务器API中未捕获的异常

依靠CORS处理JavaEE7服务器API中未捕获的异常,java,javascript,jakarta-ee,exception-handling,cors,Java,Javascript,Jakarta Ee,Exception Handling,Cors,我有一个用JavaEE7编写的服务器,运行在Wildfly 8.1.0.Final上。服务器将由托管在不同域上的多个不同JavaScript客户端使用。因此,我需要通过在每个响应上设置正确的HTTP头来启用跨源资源共享。这些标题是通过一个简单的ContainerResponseFilter添加的: @Provider public class CORSFilter implements ContainerResponseFilter { @Override public voi

我有一个用JavaEE7编写的服务器,运行在Wildfly 8.1.0.Final上。服务器将由托管在不同域上的多个不同JavaScript客户端使用。因此,我需要通过在每个响应上设置正确的HTTP头来启用跨源资源共享。这些标题是通过一个简单的
ContainerResponseFilter
添加的:

@Provider
public class CORSFilter implements ContainerResponseFilter {

    @Override
    public void filter(final ContainerRequestContext requestContext,
                       final ContainerResponseContext responseContext) throws IOException {
        responseContext.getHeaders().add("Access-Control-Allow-Origin", "*");
        responseContext.getHeaders().add("Access-Control-Allow-Headers", "origin, content-type, accept, X-Token, X-User-Name");
        responseContext.getHeaders().add("Access-Control-Allow-Credentials", "true");
        responseContext.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
        responseContext.getHeaders().add("Access-Control-Max-Age", "1209600");

        // ...
    }
}
这适用于所有“正常”请求。但是,每当服务器上抛出未捕获的异常时,HTTP 5XX响应似乎只是跳过过滤器。这意味着托管在服务器不同域上的所有JavaScript客户端(在我的例子中,这意味着每个客户端)根本无法解析响应。相反,他们只是在JavaScript控制台中看到与CORS相关的标准错误消息:

XMLHttpRequest无法加载。访问控制不允许原点允许原点。

我知道有很多方法可以拦截应用程序中的每一个异常,并在较高的级别捕获它,但我担心这会对服务器的性能造成影响。同样重要的是,该解决方案符合JEE7规范,因此很遗憾,做任何特定于JBoss/Wildfly的事情都不是一个选项

我怎样才能最好地处理这个问题


编辑:我意识到我可以让像nginx这样的web服务器反向代理到Wildfly,并让nginx在响应上设置CORS相关的HTTP头。但是,我非常希望能够将应用程序部署到任何应用程序服务器,而无需配置web服务器的额外麻烦。

您应该能够注册一个
异常apper
,以处理正常响应

然后注册一个
ExceptionMapper
,以捕获所有其他内容,添加CORS标题并映射相应的响应


这里有一些例子

我不知道例外现象是什么。非常感谢你!一个小提示:“捕获”带有ExceptionMapper的异常实际上允许响应通过ResponseFilter链,因此无需在映射器中添加新的头——过滤器为我做了这件事。