【问题标题】:RestEasy resets all headers when resource throws an exceptionRestEasy 在资源抛出异常时重置所有标头
【发布时间】:2013-11-29 07:11:19
【问题描述】:

我在启用 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. 有其他人遇到过这个问题并有任何解决方法吗?

【问题讨论】:

    标签: java cors resteasy


    【解决方案1】:

    看到您遇到这种行为,我真的很惊讶,因为我从来没有见过这种行为,而且在我这一天当然也产生了很多异常。

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

    【讨论】:

    • 没错,我可以在异常映射器中重置标头,但这与 CORS servlet 过滤器完成的逻辑重复。我宁愿不这样做,但这可能是唯一的方法。您的 cmets 表明其他一些配置不正确,但我已经通过代码跟踪并看到任何“未捕获”异常都包含对 response.reset() 的调用。
    【解决方案2】:

    我也遇到了这个问题,我有一个解决方法,就是使用响应包装器

    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));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-21
      • 2011-07-07
      • 1970-01-01
      • 2016-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多