keycloak~正確讓api接口支持跨域
相關(guān)參考
- https://leejjon.medium.com/how-to-allow-cross-origin-requests-in-a-jax-rs-microservice-d2a6aa2df484
- https://stackoverflow.com/questions/28065963/how-to-handle-cors-using-jax-rs-with-jersey
- https://keycloak.discourse.group/t/cors-problem-in-custom-rest-endpoint/7437
- https://stackoverflow.com/questions/47860019/keycloak-cors-headers-in-401
jax-ws環(huán)境的cors
return Response.ok()
.entity(p)
.header("Access-Control-Allow-Origin", "*")
.header("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT")
keycloak對jax-ws的cors封裝
下面是keycloak源碼中,針對/cert這個接口的跨域請求
@OPTIONS
@Path("certs")
@Produces(MediaType.APPLICATION_JSON)
public Response getVersionPreflight() {
return Cors.add(request, Response.ok()).allowedMethods("GET").preflight().auth().build();
}
@GET
@Path("certs")
@Produces(MediaType.APPLICATION_JSON)
@NoCache
public Response certs() {
// 相關(guān)業(yè)務(wù)代碼
Response.ResponseBuilder responseBuilder =
Response.ok().cacheControl(CacheControlUtil.getDefaultCacheControl());
return Cors.add(request, responseBuilder).allowedOrigins("*").auth().build();
}
org.keycloak.services.resources.Cors對象
org.keycloak.services.resources.Cors 類是 Keycloak 中用于處理跨域資源共享(CORS)的工具類。在 Web 開發(fā)中,由于瀏覽器的同源策略限制,跨域請求可能會受到限制,而 CORS 是一種機(jī)制,允許服務(wù)器聲明哪些源可以訪問其資源。
org.keycloak.services.resources.Cors 類提供了一些方法來幫助處理 CORS 相關(guān)的邏輯,包括:
checkCorsPreflightRequest:用于檢查是否為 CORS 預(yù)檢請求(Preflight Request),并根據(jù)請求頭信息進(jìn)行相應(yīng)處理。addHeaders:向響應(yīng)中添加 CORS 相關(guān)的頭信息,如Access-Control-Allow-Origin、Access-Control-Allow-Methods、Access-Control-Allow-Headers等。
通過使用 org.keycloak.services.resources.Cors 類,你可以更方便地處理跨域請求,確保符合 CORS 的規(guī)范,從而使得客戶端能夠安全地與 Keycloak 服務(wù)進(jìn)行交互。這個類在 Keycloak 中的一些內(nèi)部實現(xiàn)中被使用,以確保跨域請求能夠正確處理和響應(yīng)。
跨域說明
當(dāng)前端向后端發(fā)送xhr請求時,如果域名不同(a.shop.com和b.shop.com,雖然主域相同,但對于cors來說,也是跨域),瀏覽器會先發(fā)一個options的請求,返回是否支持跨域,并且告訴客戶端哪些(get,post,put,delete)方式支持跨域。
例如,如果服務(wù)端支持跨域,你的瀏覽器發(fā)送的OPTIONS請求將會返回如下截圖:

浙公網(wǎng)安備 33010602011771號