8
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

「No 'Access-Control-Allow-Origin' header is present on the requested resource. 」というエラーに遭遇しました

Last updated at Posted at 2015-04-22

初めてのSpring Boot」でREST Webサービスを写経し、Dartでクライアントサイドを記述してみたのですが、お手本どおりのコードではDartEditorにて下記のエラーになりました。

DartEditorで表示されたエラー
XMLHttpRequest cannot load http://localhost:8080/api/customers. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8081' is therefore not allowed access.
Exception: Uncaught Error: Instance of '_XMLHttpRequestProgressEvent'

##環境

  • Windows 7 (64bit)
  • DartEditor 1.9.3
  • Spring Boot 1.1.11.RELEASE

##対策

JavaScript プログラミング講座」によると、クロスオリジンリソースシェアリング(CORS)というHTML5世代の仕様らしく、任意の Web ページから、別のリソース格納場所にあるリソースを読み取りアクセスする事は、基本できないそうです。

ただこれを回避する方法はあって、サーバ側にてアクセスコントロール情報を付加したレスポンスを返せば良いんだそうです。

Springのサイトにちょうど?それに関する説明があって、レスポンス内にCORSを追加させる方法が載っていました。

正直本質的な意味は理解できていませんが、このサイトにある以下のコードを追加すれば問題は解決しました。

CORSに対応させるコード
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;

@Component
public class SimpleCORSFilter implements Filter {

	public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
		HttpServletResponse response = (HttpServletResponse) res;
		response.setHeader("Access-Control-Allow-Origin", "*");
		response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
		response.setHeader("Access-Control-Max-Age", "3600");
		response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
		chain.doFilter(req, res);
	}

	public void init(FilterConfig filterConfig) {}

	public void destroy() {}

}

##参考

8
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?