Я ищу решение для того, чтобы включить происхождение CORS на конструкциях API, построенные с помощью javax.ws.rs., java 11. Мне не разрешают использовать структуру пружины. Методы конечной точки, как это доступно в Spring Boot, где этот подход является общим принципом). много для вашего ответа. Я добавил оба класса, и теперь я получаю другую ошибку CORS (ранее жалуюсь на отсутствие заголовка доступа к обращению к доступу к Allow-Origin):
Доступ к Xmlhttprequest at 'http: // localhost: 7001/demorest-1.0-snapshot/api/rolehost:/http:/htstp:/htstp:/htost был заблокирован политикой CORS: Ответ на запрос на предварительную работу не проходит проверку контроля доступа: у него нет статуса HTTP OK. Или, может быть, способ преодолеть это? 'http://localhost:7001/demoREST-1.0-SNAP ... ment/roles' from origin 'http://localhost:4200' has been blocked by CORS policy: Request header field usage-token is not allowed by Access-Control-Allow-Headers in preflight response.
Currently, my resource class is as follows (removed all Методы, кроме получения ролей, который является предметом проблемы): < /p>
package api;
import api.entity.*;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import jpa.DbController;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.List;
import java.util.StringTokenizer;
@Path("/course-management")
public class CourseManagementApi {
Response response;
//constants for authorization
private static final String AUTHORIZATION_HEADER_PREFIX = "Basic ";
enum AuthResult {
AUTH_TRUE, AUTH_FALSE, AUTH_ERROR,
}
//getting all credential roles
@GET
@Path("/roles")
@Produces(MediaType.APPLICATION_JSON)
public Response getRolesList() {
Gson gson = new Gson();
JsonArray jsonArray;
try {
List listCredentialRoles = DbController.getCredentialRolesList();
if (listCredentialRoles.isEmpty()) {
response = Response.status(Response.Status.NOT_FOUND).entity("[{}]").build();
} else {
jsonArray = gson.toJsonTree(listCredentialRoles).getAsJsonArray();
response = Response.ok(jsonArray.toString(), MediaType.APPLICATION_JSON).build();
}
} catch (Exception e) {
response = Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
}
return response;
}
}
< /code>
Я реализовал два перехватчика, сначала - фильтр безопасности: < /p>
package api;
import jpa.DbController;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.Provider;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.List;
@Provider//gets automatically provided to api class (CourseManagementApi)
public class SecurityFilter implements ContainerRequestFilter {
//constant for authorization
private static final String USAGE_TOKEN_HEADER_KEY = "Usage-Token";
@Override
//method gets executed prior to execution of particular API methods (in CourseManagementApi class)!!!
public void filter(ContainerRequestContext requestContext) throws IOException {
//request MUST contain UsageToken header key with base64 encoded value!!!
List usageTokenHeader = requestContext.getHeaders().get(USAGE_TOKEN_HEADER_KEY);
//usageTokenHeader value is correct
try {
//Integer i = 6/0;
//UsageToken header key value must be "Students"
if (!(new String(Base64.getDecoder().decode(usageTokenHeader.get(0)), StandardCharsets.UTF_8)).equals("students")) {
//abort request
requestContext.abortWith(Response.status(Response.Status.UNAUTHORIZED).entity("[{}]").build());
}
} catch (Exception e) {
DbController.logError(e, "SecurityFilter.filter");
requestContext.abortWith(Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("[{}]").build());
}
}
}
< /code>
А второй - тот, который вы предложили: < /p>
package api;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.Provider;
import java.io.IOException;
@Provider
public class CorsFilter implements ContainerResponseFilter, ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
if ("OPTIONS".equalsIgnoreCase(requestContext.getMethod())) {
// Abort chain and return OK right away
requestContext.abortWith(
Response.ok()
.header("Access-Control-Allow-Origin", requestContext.getHeaderString("Origin"))
.header("Access-Control-Allow-Credentials", "true")
.header("Access-Control-Allow-Headers", "origin, content-type, accept, authorization")
.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD")
.build()
);
}
}
@Override
public void filter(ContainerRequestContext req, ContainerResponseContext resp) throws IOException {
resp.getHeaders().putSingle("Access-Control-Allow-Origin", req.getHeaderString("Origin"));
resp.getHeaders().add("Access-Control-Allow-Credentials", "true");
resp.getHeaders().add("Access-Control-Allow-Headers", "origin, content-type, accept, authorization");
resp.getHeaders().add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");
}
}
< /code>
Ресурс «Параметры» вообще не запускается, поэтому я удалил его из пакета. Как вы думаете, остается ли все, что осталось сделать/изменить/добавить/что -то ...?
p.s. Все, конечно, работает нормально, если звонки сделаны из почтового или через угловое приложение, где прокси определен для маскировки происхождения (но если приложение AngualR развернуто на сервер, в моем случае, это больше не работает ...)
Подробнее здесь: https://stackoverflow.com/questions/797 ... pplication
Как включить CORS в приложении CORS в приложении, не связанной ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение