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に慣れていないので、なぜこれが機能しなかったのか理解できません。どんな助けも大歓迎です。反応を待っています。
ありがとう
リソースメソッドはヒットしないため、ヘッダーは設定されません。その理由は、実際のリクエストの前にプリフライトリクエストと呼ばれるものがあり、それがOPTIONS
リクエストだからです。そのため、プリフライトリクエストが必要なヘッダーを生成しないという事実からエラーが発生します。
RESTeasyの場合、 CorsFilter
を使用する必要があります。 here を見ると、設定方法の例がわかります。このフィルターはプリフライトリクエストを処理します。そのため、リソースメソッドにあるすべてのヘッダーを削除できます。
関連項目:
あなたのリソースPOST
methodは@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();
}