当资源抛出异常时,RestEasy会重置所有标头

时间:2013-11-15 19:10:05

标签: java cors resteasy

我在使用Cors的jBoss服务器中使用resteasy-jaxrs时发现了一些奇怪的东西。这是设置:

我们的服务器启用了transactioncompany.com的CorsFilter(v1.3.2)作为servlet过滤器来启用CORS并将相应的CORS头添加到HttpServletResponse对象。

服务器本身正在使用resteasy-jaxrs(v2.3.2.Final)来为我们的应用程序提供JSON端点,显然是在一个单独的域上运行。

问题是,如果我的一个端点方法生成任何类型的异常(NPE,UnauthorizedException,InternalServerErrorException),作为准备响应的一部分,RestEasy会进行调用

(HttpServletResponse)response.reset() 

清除我的CORS标头。这会导致Chrome正确行动,就好像应该取消请求一样。这对于需要这些错误代码的前端开发人员来说真的很不方便。

两个问题:

  1. 为什么RestEasy想要清除这些标题?
  2. 是否有其他人遇到此问题并有任何解决方法?

2 个答案:

答案 0 :(得分:0)

我很惊讶地发现你遇到过这种行为,因为我从未见过这种行为,而且我当然在我的日子里产生了很多例外。

无论如何,请考虑按照here所述编写自定义ExceptionMapper。您可以使用CORS标头填充响应,并将其从toResponse返回以及相应的错误信息。

答案 1 :(得分:0)

我也遇到了这个问题,我通过使用响应包装器

进行了解决方法
class CorsHeaderResponseWrapper extends HttpServletResponseWrapper{

    public CorsHeaderResponseWrapper(HttpServletResponse resp) {
        super(resp);
        setCorsHeader();
    }

    void setCorsHeader(){
        HttpServletResponse resp = (HttpServletResponse)getResponse();
        //set cors header here
    }

    public void reset(){
        super.reset();
        //set again if anyone reset it
        setCorsHeader();
    }

}

调用doFilter时

chain.doFilter(req, new CorsHeaderResponseWrapper(resp));