keycloak~正确让api接口支持跨域

keycloak,api · 浏览次数 : 0

小编点评

**跨域请求处理指南** 为了处理跨域请求,您需要使用 Keycloak 工具类 `Cors` 来配置服务器。以下是设置跨域请求的步骤: 1. **创建 `Cors` 对象**: ```java Cors cors = Cors.create(); ``` 2. **设置 `allowedOrigins` 属性**: ```java cors.setAllowedOrigins("*"); ``` 此属性允许来自任何源的跨域请求。 3. **设置 `allowedMethods` 属性**: ```java cors.setAllowedMethods("GET, POST, DELETE, PUT"); ``` 此属性指定允许的 HTTP 方法,例如 GET、POST、DELETE 和 PUT。 4. **设置 `allowedHeaders` 属性**: ```java cors.setAllowedHeaders("Content-Type, Authorization, X-Foo, X-Bar"); ``` 此属性指定允许的 HTTP 头部字段,例如 Content-Type、Authorization 和 X-Foo。 5. **设置 `exposedHeaders` 属性**: ```java cors.setExposedHeaders("Access-Control-Allow-Origin, Access-Control-Allow-Methods, Access-Control-Allow-Headers"); ``` 此属性指定要暴露的 CORS 头部字段。 6. **构建跨域请求**: ```java Response corsResponse = Cors.add(request, cors); ``` 此方法将添加 CORS 请求到响应中,其中 `request` 是 HTTP 请求对象。 7. **响应跨域请求**: ```java return corsResponse.build(); ``` 此方法将返回响应,其中包含 CORS 信息。 **示例** ```java // 设置 CORS 配置 Cors cors = Cors.create(); cors.setAllowedOrigins("*"); cors.setAllowedMethods("GET, POST, DELETE, PUT"); cors.setAllowedHeaders("Content-Type, Authorization, X-Foo, X-Bar"); // 创建 HTTP 请求 HttpRequest request = HttpRequest.GET("/certs"); // 设置 CORS 请求 Response corsResponse = Cors.add(request, cors); // 返回响应 return corsResponse.build(); ``` **注意** * 跨域请求可能需要多个 HTTP 方法才能处理。 * 确保您信任您接收的源。 * 您也可以使用 `@PreFilter` 筛选器来更细化 CORS 配置。

正文

相关参考

jax-ws环境的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() {
  // 相关业务代码
   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 开发中,由于浏览器的同源策略限制,跨域请求可能会受到限制,而 CORS 是一种机制,允许服务器声明哪些源可以访问其资源。

org.keycloak.services.resources.Cors 类提供了一些方法来帮助处理 CORS 相关的逻辑,包括:

  • checkCorsPreflightRequest:用于检查是否为 CORS 预检请求(Preflight Request),并根据请求头信息进行相应处理。
  • addHeaders:向响应中添加 CORS 相关的头信息,如 Access-Control-Allow-OriginAccess-Control-Allow-MethodsAccess-Control-Allow-Headers 等。

通过使用 org.keycloak.services.resources.Cors 类,你可以更方便地处理跨域请求,确保符合 CORS 的规范,从而使得客户端能够安全地与 Keycloak 服务进行交互。这个类在 Keycloak 中的一些内部实现中被使用,以确保跨域请求能够正确处理和响应。

跨域说明

当前端向后端发送xhr请求时,如果域名不同(a.shop.com和b.shop.com,虽然主域相同,但对于cors来说,也是跨域),浏览器会先发一个options的请求,返回是否支持跨域,并且告诉客户端哪些(get,post,put,delete)方式支持跨域。

例如,如果服务端支持跨域,你的浏览器发送的OPTIONS请求将会返回如下截图:

与keycloak~正确让api接口支持跨域相似的内容: