web-dev-qa-db-ja.com

要求されたリソースに「Access-Control-Allow-Origin」ヘッダーがありません-Resteasy

UI-Angular、Server-Java、RestEasy 3.0.9。REST API呼び出しの最終で構成されるWebアプリケーションで作業しています

別のドメインから残りのサービスにアクセスしようとしたときにエラーが発生しています

CANNOT LOADプリフライト要求への応答はアクセス制御チェックに合格しません:要求されたリソースに「Access-Control-Allow-Origin」ヘッダーがありません。オリジン ' http:// localhost:808 'はアクセスを許可されません。

クロスドメインコールで応答するようにサーバー側を設定しましたが、これはGETコールで機能していますが、POSTコールでエラーが発生します

web.xml

<context-param>
    <param-name>resteasy.providers</param-name>
    <param-value>com.test.sample.app.CorsFeature</param-value>
</context-param>

<listener>
    <listener-class>
        org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
</listener>


<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
    <servlet-name>resteasy-servlet</servlet-name>
    <servlet-class>
        org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>com.test.sample.app.Application</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>resteasy-servlet</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

<context-param>
    <param-name>resteasy.servlet.mapping.prefix</param-name>
    <param-value>/rest</param-value>
</context-param>
<context-param>
    <param-name>resteasy.scan</param-name>
    <param-value>true</param-value>
</context-param>

サービスクラス

@GET
@Path("/getnameAtt")
@Produces(MediaType.APPLICATION_JSON)
public Response getHostnameAttributes() {
return Response
.status(200)
.header("Access-Control-Allow-Origin", "*")
.header("Access-Control-Allow-Headers",
        "Origin, content-type, accept, authorization")
.header("Access-Control-Allow-Credentials", "true")
.header("Access-Control-Allow-Methods",
        "GET, POST, PUT, DELETE, OPTIONS, HEAD")
.header("Access-Control-Max-Age", "1209600")
.entity(new TestImpl().getHostNameAttributes())
.build();
}

@POST
@Path("/getSeq")
@Produces(MediaType.APPLICATION_JSON)
public Response getCurrentSequence(String request) {
return Response
.status(200)
.header("Access-Control-Allow-Origin", "*")
.header("Access-Control-Allow-Headers",
        "Origin, content-type, accept, authorization")
.header("Access-Control-Allow-Credentials", "true")
.header("Access-Control-Allow-Methods",
        "GET, POST, PUT, DELETE, OPTIONS, HEAD")
.header("Access-Control-Max-Age", "1209600")
.entity(new TestImpl().getCurrentSeq(request))
.build();
}

私はresteasyに慣れていないので、なぜこれが機能しなかったのか理解できません。どんな助けも大歓迎です。反応を待っています。

ありがとう

20
PremKumarR

リソースメソッドはヒットしないため、ヘッダーは設定されません。その理由は、実際のリクエストの前にプリフライトリクエストと呼ばれるものがあり、それがOPTIONSリクエストだからです。そのため、プリフライトリクエストが必要なヘッダーを生成しないという事実からエラーが発生します。

RESTeasyの場合、 CorsFilter を使用する必要があります。 here を見ると、設定方法の例がわかります。このフィルターはプリフライトリクエストを処理します。そのため、リソースメソッドにあるすべてのヘッダーを削除できます。

関連項目:

11
Paul Samsotha

あなたのリソースPOSTmethodは@peeskilletが言及しているようにヒットしないようです。ほとんどの場合、〜POST〜リクエストは機能しません。これは単純なリクエストではない可能性があるためです。単純な要求はGET、HEADまたはPOSTのみで、要求ヘッダーは単純です(単純なヘッダーはAccept、Accept-Language、Content-Language、Content-Type = application/xのみです-www-form-urlencoded、multipart/form-data、text/plain)。

既にAccess-Control-Allow-OriginヘッダーをResponseに追加しているため、新しいOPTIONSメソッドをリソースクラスに追加できます。

    @OPTIONS
@Path("{path : .*}")
public Response options() {
    return Response.ok("")
            .header("Access-Control-Allow-Origin", "*")
            .header("Access-Control-Allow-Headers", "Origin, content-type, accept, authorization")
            .header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD")
            .header("Access-Control-Max-Age", "2000")
            .build();
}
0
Ranuka