# 启用或禁用 CORS
# 开启后将处理CORS预检请求
# 它还将查看访问令牌以确定有效的来源。
# 该配置项不是必须的,默认值是false。
keycloak.cors=false
# 如果启用了 CORS
# 设置响应header Access-Control-Max-Age 的值
# 用来指定每次预检请求的有效期,单位为秒
# 1728000秒=20天
# 该配置项不是必须的
# 如果配置项未配置,则响应header中不包含 Access-Control-Max-Age
keycloak.cors-max-age=1728000
# 如果启用了 CORS
# 设置响应header Access-Control-Allow-Methods 的值
# 值的格式应该是以逗号分隔的字符串。
# 表明服务器支持的所有跨域请求的方法
# 返回的是所有支持的方法,而不单是浏览器请求的那个方法。
# 这是为了避免多次"预检"请求。
# 该配置项不是必须的
# 如果配置项未配置,则响应header中不包含 Access-Control-Allow-Methods
keycloak.cors-allowed-methods=POST,PUT,DELETE,GET,OPTIONS,PATCH
# 如果启用了 CORS
# 设置响应header Access-Control-Allow-Headers 的值
# 值的格式应该是以逗号分隔的字符串。
# 表明服务器支持的所有请求头信息字段,不限于浏览器在"预检"中请求的字段
# 该配置项不是必须的
# 如果配置项未配置,则响应header中不包含 Access-Control-Allow-Headers
keycloak.cors-allowed-headers=Authorization, Origin, X-Requested-With, Content-Type, X-Custom-Header
# 如果启用了 CORS
# 设置响应header Access-Control-Expose-Headers 的值
# 值的格式应该是以逗号分隔的字符串。
# CORS请求时,XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段:
# Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。
# 如果想拿到其他字段,就必须在Access-Control-Expose-Headers里面指定.
# 该配置项不是必须的
# 如果配置项未配置,则响应header中不包含 Access-Control-Expose-Headers.
# keycloak.cors-exposed-headers=requestId
注意:
1、很重要的一点,不知道是不是keycloak的bug。
浏览器跨域请求后端服务,后端服务设置为允许跨域,
非简单请求时,预检是通过的,
无论简单请求还是非简单请求,
如果请求不携带Token的话,
虽然后端服务成功执行了,
但是,响应header中不存在Access-Control-Allow-Origin,
导致,ajax脚本仍然无法获取后端返回的数据,
此时,浏览器控制台仍然会报:
No 'Access-Control-Allow-Origin' header is present on the requested resource
的错误。
从而导致,白名单中的 URL 无法被浏览器跨域访问了。
2、keycloak cors 不支持指定 Access-Control-Allow-Origin,
只能使用默认值 * ,即:支持所有的 Origins。
3、浏览器跨域简单请求后端接口,
不管后端是否允许跨域,请求都能到达后端并正常执行,
正常响应状态码是200,只是客户端ajax脚本取不到响应的数据。
4、浏览器跨域简单请求后端接口,
如果请求的后端接口抛出了异常,
浏览器端控制台仍然会提示
No 'Access-Control-Allow-Origin' header is present on the requested resource
但是,此时的响应状态码不再是200.
一则预检请求示例
一则正式请求示例
----------------------------------------------------------------------------