問題
Apache Jena Fuseki 2 で Readonly SPARQL Endpoint の方法でエンドポイントを立てると Cross Origin Resource Sharing ができない。
HTTP レスポンスヘッダに Access-Control-Allow-Origin: *
がついていないのでどうしょうもない。Fuseki 1 ではついていたのに。
原因
ここに書いてある通り。version 1 → 2 の際に設定方法が変わった、とかではなく、そもそも実装されていない。2.3.1 でフィックスされたとのこと。
対策
2.3.1 がリリースされたらそちらを使うのが最良ではあるもの、現行2.3.0 では以下の手順で。
WAR版 ではなくて組み込み版を使っている場合には jetty のorg.eclipse.jetty.servlets.CrossOriginFilter がビルトインで使えるので、FUSEKI_BASE/webapp/WEB-INF/web.xml に以下のフィルタ設定を追加することで CORS ヘッダをつけてくれるようになる。
web.xml
<!-- CORS filter-->
<filter>
<filter-name>cross-origin</filter-name>
<filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
<init-param>
<param-name>allowedOrigins</param-name>
<param-value>*</param-value>
</init-param>
<init-param>
<param-name>allowedMethods</param-name>
<param-value>GET,POST,DELETE,PUT,HEAD,OPTIONS</param-value>
</init-param>
<init-param>
<param-name>allowedHeaders</param-name>
<param-value>Accept, Origin, X-Requested-With, Content-Type, Last-Modified, Authorization</param-value>
</init-param>
<init-param>
<param-name>exposedHeaders</param-name>
<param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>cross-origin</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
WAR 版で jetty 以外の Servlet Container を使っている場合にはこの方法は使えないのでご注意を。2.3.1 のリリースを待つか、自力で Filter を持ってくるなどしましょう。