2013-11-15 22 views
1

在Cors啓用的jBoss服務器中使用resteasy-jaxrs時,我發現了一些奇怪的東西。這裏的設置:RestEasy在資源引發異常時重置所有頭文件

我們的服務器已經啓用了transactcompanycompany.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. 有沒有其他人跑過這個,並有任何解決方法?

回答

0

我真的很驚訝地看到,你遇到過這種行爲,因爲我從來沒有見過它,而且我當然在我的一天中產生了很多例外。

無論如何,可以考慮按照here所述編寫自定義ExceptionMapper。您可以使用CORS標頭填充響應,並將其從toResponse以及相應的錯誤信息中返回。

+0

真時,我可以重置一個異常映射表頭,但它重複了CORS servlet過濾器完成的邏輯。我寧願不這樣做,但它可能是唯一的方法。您的意見暗示其他一些配置不正確,但我追蹤了代碼並發現任何「未捕獲」異常包含對response.reset()的調用。 – rtcarlson

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)); 
相關問題