簡體   English   中英

為什么 CORSFilter 與 ExceptionMapper 沖突<Throwable> ?

[英]Why CORSFilter conflicts with ExceptionMapper<Throwable>?

我有這個 Java thorntail 應用程序,我想在其中捕獲所有未捕獲的異常。

我想用 500 而不是 JAXRS 給出的默認錯誤頁面來響應,所以我只使用了ExceptionMapper<Throwable>

使用 Postman 進行了測試沒有問題,但是一旦我嘗試在瀏覽器中進行 AJAX 調用,我最終發送了 OPTIONS 請求,該請求失敗了。

CORS 部分也通過實現ContainerResponseFilter在應用程序端實現。

我有一種感覺,MATCHING 發生在請求的早期階段,后來 CORSFilter 才對響應產生影響。

我已經嘗試過的幾件事:

  • @預匹配
  • @優先事項
  • 嘗試導入 jboss.resteasy CorsFilter
  • 試圖通過exception instanceof DefaultOptionsMethodException過濾掉異常,但最終發現DefaultOptionsMethodException不在類路徑中,它是包含在 thorntails 類路徑 (??) 中的內部 (?) 包
  • ...
// CORSFilter
package com.testapplication.test.rest;

import java.io.IOException;

import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.ext.Provider;

@Provider
public class CORSFilter implements ContainerResponseFilter {
    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {
        responseContext.getHeaders().add("Access-Control-Allow-Origin", "*");
        responseContext.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
        responseContext.getHeaders().add("Access-Control-Max-Age", "-1");
        responseContext.getHeaders().add("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    }
}
// UncaughtExceptionMapper
package com.testapplication.test.rest;

import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

@Provider
public class UncaughtExceptionMapper extends Throwable implements ExceptionMapper<Throwable> {
    @Override
    public Response toResponse(Throwable exception) {
        exception.printStackTrace();
        return Response.status(500).entity("{\"message\": \"a\"}").build();
    }
}

示例存儲庫: https : //github.com/trimpirim/cors-filter-conflict-exception-mapper

試試這篇文章底部的過濾器。 僅使用響應過濾器將無法正確執行 CORS 交互。 您還需要一個請求過濾器來中止對預檢請求的請求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM