在依赖 CORS 的 Java EE 7 Server API 中处理未捕获的异常
Posted
技术标签:
【中文标题】在依赖 CORS 的 Java EE 7 Server API 中处理未捕获的异常【英文标题】:Dealing with uncaught exceptions in Java EE 7 Server API relying on CORS 【发布时间】:2014-09-19 10:34:49 【问题描述】:我有一个用 Java EE 7 编写的服务器,在 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 cannot load <server URL>. Origin <JavaScript client URL> is not allowed by Access-Control-Allow-Origin.
我知道有一些方法可以拦截应用程序中的每一个异常并在较高级别捕获它,但我担心这会对我的服务器产生性能影响。该解决方案符合 JEE7 规范也很重要,因此很遗憾,无法执行任何特定于 JBoss/Wildfly 的操作。
我怎样才能最好地处理这个问题?
编辑:我意识到我可以让像 nginx 这样的 Web 服务器反向代理 Wildfly,并让 nginx 在响应中设置与 CORS 相关的 HTTP 标头。但是,我非常希望能够将应用程序部署到任何应用程序服务器上,而无需额外配置 Web 服务器。
【问题讨论】:
【参考方案1】:您应该能够注册ExceptionMapper<WebApplicationException>
来处理正常响应。
然后注册一个ExceptionMapper<Throwable>
以捕获所有其他,添加您的 CORS 标头并映射适当的响应。
这里有一些例子http://avianey.blogspot.com/2011/12/exception-mapping-jersey.html
【讨论】:
我不知道 ExceptionMappers 甚至是一个东西。太感谢了!一个小提示:使用 ExceptionMapper “捕获”异常实际上允许响应通过 ResponseFilter 链,因此无需在映射器中添加新标头 - 过滤器为我做了这些。以上是关于在依赖 CORS 的 Java EE 7 Server API 中处理未捕获的异常的主要内容,如果未能解决你的问题,请参考以下文章
WEB-INF 在 Java EE Web 应用程序中代表啥? [关闭]
在 Tomcat 7 中运行 Java EE 7 WebSockets
基于 Java EE 的 Web 应用程序服务器中的 JAAS 安全性是不是依赖?