web-dev-qa-db-ja.com

すべての応答にヘッダーを自動的に追加します

このヘッダー「Access-Control-Allow-Origin」、「*」を、アプリケーション内のレストコントローラーにリクエストを送信するたびにクライアントに行われるすべての応答に追加して、クロスオリジンリソース共有を許可します。現在、これを手動で追加しています。このような各メソッドへのヘッダー

HttpHeaders headers = new HttpHeaders();
headers.add("Access-Control-Allow-Origin", "*");

その動作は非常にイライラします。私は春のドキュメントでwebContentInterceptorを見つけました。これにより、各応答のヘッダーを変更できます

<mvc:interceptors>
<bean id="webContentInterceptor" 
class="org.springframework.web.servlet.mvc.WebContentInterceptor">
<property name="Access-Control-Allow-Origin" value="*"/>
</bean>
</mvc:interceptors>

しかし、これを使用すると、Access-Control-Allow-Originという名前のプロパティが見つからないというエラーがスローされるため、すべての応答にヘッダーを自動的に追加する他の方法があります

アップデート! Spring Framework 4.2では、@ CrossOriginアノテーションをメソッドまたはコントローラー自体に追加することにより、これを大幅に簡素化しています https://spring.io/blog/2015/06/08/cors-support-in-spring-framework =

38
Mayank Sharma

私は最近この問題に取り組み、この解決策を見つけました。フィルターを使用してこれらのヘッダーを追加できます。

_import Java.io.IOException;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.filter.OncePerRequestFilter;

public class CorsFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request,
                                    HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
            response.addHeader("Access-Control-Allow-Origin", "*");
            if (request.getHeader("Access-Control-Request-Method") != null
                    && "OPTIONS".equals(request.getMethod())) {
                // CORS "pre-flight" request
                response.addHeader("Access-Control-Allow-Methods",
                        "GET, POST, PUT, DELETE");
                response.addHeader("Access-Control-Allow-Headers",
                        "X-Requested-With,Origin,Content-Type, Accept");
            }
            filterChain.doFilter(request, response);
    }

}
_

春のコンテキストにフィルターを追加することを忘れないでください:

_<bean id="corsFilter" class="my.package.CorsFilter" />
_

およびweb.xmlのマッピング:

_<filter>
    <filter-name>corsFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
    <filter-name>corsFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
_

さらに先に進むには、Springプロファイルを指定して、このようなフィルターを有効または無効にします。

_<beans profile="!cors">
    <bean id="corsFilter" class="my.package.FilterChainDoFilter" />
</beans>

<beans profile="cors">
    <bean id="corsFilter" class="my.package.CorsFilter" />
</beans>
_

(CorsFilterに似ていますが、doFilterInternal(..)でfilterChain.doFilter(request, response);のみを行うFilterChainDoFilterを提供します)

57
Dayde

アップデート! Springフレームワーク4.2では、メソッドまたはコントローラー自体に@CrossOriginアノテーションを追加することでこれを大幅に簡素化します https://spring.io/blog/2015/06/08/cors-support-in-spring-framework =

15
Mayank Sharma

コントローラーのヘッダーを設定する場合は、@ModelAttribute注釈。

@ModelAttribute
public void setVaryResponseHeader(HttpServletResponse response) {
    response.setHeader("Vary", "Accept");
}    
5
Andrei N

Spring 4では、@ CrossOrigin()を使用できます。これにより、クロスオリジンの問題を解決できます。

セキュリティ上の理由から、ブラウザは現在のOriginの外部にあるリソースへの呼び出しAJAXを禁止しています。たとえば、あるタブで銀行口座を確認している場合、evil.comウェブサイトを別のタブでtab。evil.comのスクリプトは、認証情報を使用して、銀行のAPIにAJAXリクエストを銀行口座から引き出します!)することはできません。

Cross-Origin Resource Sharing(CORS)は、ほとんどのブラウザーで実装されているW3C仕様であり、IFrameやJSONPなどの安全性の低いハッキングを使用する代わりに、どのようなクロスドメインリクエストを許可するかを柔軟に指定できます。

Spring Framework 4.2 GAは、すぐに使えるCORSのファーストクラスのサポートを提供し、通常のフィルターベースのソリューションよりも簡単で強力な設定方法を提供します。

@RequestMappingアノテーション付きハンドラーメソッドに@CrossOriginアノテーションを追加して、CORSで有効にすることができます。デフォルトでは、@ CrossOriginは、@ RequestMappingアノテーションで指定されたすべてのオリジンとHTTPメソッドを許可します。

@RestController
@RequestMapping("/account")
public class AccountController {

    @CrossOrigin
    @RequestMapping("/{id}")
    public Account retrieve(@PathVariable Long id) {
        // ...
    }

    @RequestMapping(method = RequestMethod.DELETE, path = "/{id}")
    public void remove(@PathVariable Long id) {
        // ...
    }
}

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/cors.html

https://spring.io/guides/gs/rest-service-cors/

https://spring.io/blog/2015/06/08/cors-support-in-spring-framework

1
Sudhakar

WebContentInterceptor にはAccess-Control-Allow-Originという名前のプロパティがありません。また、私が見る限り、応答ヘッダーを設定するためのメソッドを公開していません。一部のプロパティを有効/無効にすることで、キャッシュ関連のヘッダーのみを設定します。しかし、これを行う独自のインターセプター(またはサーブレットフィルター)を記述するのは簡単です。

0
NilsH

私もこの問題に直面しており、このコードの問題を修正しました。

public static HttpServletResponse getResponse(HttpServletResponse response) {
    response.setHeader("Access-Control-Allow-Origin", "*");
    response.setCharacterEncoding("UTF-8");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET");
    response.setHeader("Access-Control-Allow-Headers", "x-requested-with");
    return response;
}
0
Poocholamannan