50public record
CorsPolicy(
boolean allowAnyOrigin, List<String> allowedOrigins, List<String> allowedMethods,
51 List<String> allowedHeaders, List<String> exposedHeaders,
boolean allowCredentials,
int maxAgeSeconds,
55 allowedOrigins = copyList(allowedOrigins);
56 allowedMethods = copyList(allowedMethods);
57 allowedHeaders = copyList(allowedHeaders);
58 exposedHeaders = copyList(exposedHeaders);
62 return new CorsPolicy(
true, List.of(), defaultMethods(), List.of(
"*"), List.of(),
false, 3600,
true);
65 public static CorsPolicy strict(
final List<String> allowedOrigins) {
66 return new CorsPolicy(
false, allowedOrigins, defaultMethods(), List.of(
"content-type",
"authorization"),
67 List.of(),
false, 3600,
true);
70 public boolean isOriginAllowed(
final String origin) {
74 if (origin ==
null || origin.isBlank()) {
77 for (
final var allowed : allowedOrigins) {
78 if (matches(allowed, origin)) {
85 public Map<String, String> responseHeaders(
final String origin) {
86 final var
headers =
new LinkedHashMap<String, String>();
88 headers.put(
"Access-Control-Allow-Origin",
"*");
89 }
else if (isOriginAllowed(origin)) {
90 headers.put(
"Access-Control-Allow-Origin", origin);
92 headers.put(
"Access-Control-Allow-Methods", String.join(
", ", allowedMethods));
93 headers.put(
"Access-Control-Allow-Headers", String.join(
", ", allowedHeaders));
94 if (!exposedHeaders.isEmpty()) {
95 headers.put(
"Access-Control-Expose-Headers", String.join(
", ", exposedHeaders));
97 if (allowCredentials) {
98 headers.put(
"Access-Control-Allow-Credentials",
"true");
100 headers.put(
"Access-Control-Max-Age", Integer.toString(maxAgeSeconds));
107 private static List<String> copyList(
final List<String> values) {
108 return values ==
null ? List.of() : List.copyOf(values);
111 private static boolean matches(
final String allowed,
final String candidate) {
112 if (allowed ==
null || candidate ==
null) {
115 if (
"*".equals(allowed)) {
118 return Objects.equals(allowed, candidate);
121 private static List<String> defaultMethods() {
122 return List.of(
"GET",
"POST",
"PUT",
"PATCH",
"DELETE",
"OPTIONS",
"HEAD");
record CorsPolicy(boolean allowAnyOrigin, List< String > allowedOrigins, List< String > allowedMethods, List< String > allowedHeaders, List< String > exposedHeaders, boolean allowCredentials, int maxAgeSeconds, boolean varyOrigin)
Política de seguridad CORS para controlar el acceso entre orígenes.