11

Jersey CORSリクエストは POST では機能しませんが、GET リクエストでは機能します。以下の同じリソースへの GET リクエストのスクリーンショットに示すように、ヘッダーは Jersey リクエストにマップされています。

ただし、以下のメソッドに POST を実行すると、最終的にはXMLHttpRequest cannot load http://production.local/api/workstation. Origin http://workstation.local:81 is not allowed by Access-Control-Allow-Origin.

ネットワーク アクティビティのスクリーンショットを次に示します。 ここに画像の説明を入力

失敗した POST リクエストの詳細: ここに画像の説明を入力

これが私のリソースです:

@Path("/workstation")
@Consumes({MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_JSON})
public class WorkstationResource {

    @InjectParam
    WorkstationService workstationService;

    @POST
    public WorkstationEntity save (WorkstationEntity workstationEntity) {
        workstationService.save(workstationEntity);
        return workstationEntity;
    }

    @GET
    @Path("/getAllActive")
    public Collection<WorkflowEntity> getActive () {
        List<WorkflowEntity> workflowEntities = new ArrayList<WorkflowEntity>();
        for(Workflow workflow : Production.getWorkflowList()) {
            workflowEntities.add(workflow.getEntity());
        }
        return workflowEntities;
    }
}

私の CORS フィルター:

public class ResponseCorsFilter implements ContainerResponseFilter {

    @Override
    public ContainerResponse filter(ContainerRequest request, ContainerResponse response) {

        Response.ResponseBuilder responseBuilder = Response.fromResponse(response.getResponse());
        responseBuilder
                .header("Access-Control-Allow-Origin", "*")
                .header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, HEAD");

        String reqHead = request.getHeaderValue("Access-Control-Request-Headers");

        if(null != reqHead && !reqHead.equals(null)){
            responseBuilder.header("Access-Control-Allow-Headers", reqHead);
        }

        response.setResponse(responseBuilder.build());

        return response;
    }
}

私のメインクラスのジャージー構成:

//add jersey servlet support
ServletRegistration jerseyServletRegistration = ctx.addServlet("JerseyServlet", new SpringServlet());
jerseyServletRegistration.setInitParameter("com.sun.jersey.config.property.packages", "com.production.resource");
jerseyServletRegistration.setInitParameter("com.sun.jersey.spi.container.ContainerResponseFilters", "com.production.resource.ResponseCorsFilter");
jerseyServletRegistration.setInitParameter("com.sun.jersey.api.json.POJOMappingFeature", Boolean.TRUE.toString());
jerseyServletRegistration.setInitParameter("com.sun.jersey.config.feature.DisableWADL", Boolean.TRUE.toString());
jerseyServletRegistration.setLoadOnStartup(1);
jerseyServletRegistration.addMapping("/api/*");
4

2 に答える 2

1

応答 (ヘッダー) の検査時にそのエラーを生成するのはブラウザーであるため、伝えるのもデバッグするのも困難です。

Access-Control-Allow-Headers非常に綿密な検査でも、 で 2 回設定されている、または 2 回設定されている可能性があることを除いて、コードは問題なく正常に見えますfilter()RFC 2616 (HTTP 1.1) セクション 4.2では、特定の条件が満たされていれば、基本的に許可されていますが、ここでは賭けません。ブラウザ X バージョン N がこれを処理する方法を制御することはできません。

同じヘッダーを異なる値で 2 回設定する代わりに、2 番目の値のセットを既存のヘッダーに追加します。

于 2013-05-29T20:46:38.590 に答える