3

アプリケーションが REST API と Web アプリケーションをホストするユース ケースがあり、REST API のみにカスタム ヘッダーを追加する必要があります。REST API は、Spring Data REST を通じて有効になります。通常、サーブレット フィルターを使用してこれを実現できますが、REST API へのリクエストを分離するロジックをコーディングし、カスタム ヘッダーを追加する必要があります。Spring Data REST API が、生成するすべてのレスポンスにデフォルト ヘッダーを追加できるようにするとよいでしょう。あなたの考えは何ですか?私が怠け者だとは言わないでください:)

4

3 に答える 3

8

実際の実装の詳細を探している人々のために..

インターセプター

public class CustomInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        System.out.println("adding CORS headers.....");
        response.addHeader("HEADER-NAME", "HEADER-VALUE");
        return true;
    }

}

Java 構成

@Configuration
public class RepositoryConfig extends
        RepositoryRestMvcConfiguration {

    @Override
    public RequestMappingHandlerMapping repositoryExporterHandlerMapping() {
        RequestMappingHandlerMapping mapping = super
                .repositoryExporterHandlerMapping();

        mapping.setInterceptors(new Object[] { new CustomInterceptor() });
        return mapping;
    }
}
于 2013-10-29T19:29:40.210 に答える
4

Spring Data REST は Spring MVC の上に構築されているため、最も簡単な方法は、参照ドキュメントHandlerInterceptorで説明されているようにカスタムを構成することです。

Spring Data REST を使用する最も簡単な方法は、 を拡張RepositoryRestMvcConfigurationしてオーバーライドrepositoryExporterHandlerMappingし、親メソッドを呼び出し….setInterceptors(…)てから呼び出すことです。

于 2013-10-09T07:38:31.910 に答える
1

最後に、spring-data-rest 2.4.1.RELEASE でも動作するカスタム インターセプターのセットアップを行うことができました。

@Configuration
public class RestMvcConfig extends RepositoryRestMvcConfiguration {

    @Autowired UserInterceptor userInterceptor;

    @Autowired ApplicationContext applicationContext;

    @Override
    public DelegatingHandlerMapping restHandlerMapping() {

        RepositoryRestHandlerMapping repositoryMapping = new RepositoryRestHandlerMapping(resourceMappings(), config());
        repositoryMapping.setInterceptors(new Object[] { userInterceptor }); // FIXME: not nice way of defining interceptors
        repositoryMapping.setJpaHelper(jpaHelper());
        repositoryMapping.setApplicationContext(applicationContext);
        repositoryMapping.afterPropertiesSet();

        BasePathAwareHandlerMapping basePathMapping = new BasePathAwareHandlerMapping(config());
        basePathMapping.setApplicationContext(applicationContext);
        basePathMapping.afterPropertiesSet();

        List<HandlerMapping> mappings = new ArrayList<HandlerMapping>();
        mappings.add(basePathMapping);
        mappings.add(repositoryMapping);

        return new DelegatingHandlerMapping(mappings);  
    }

}

メソッドをオーバーライドし、そのrestHandlerMappingコンテンツをコピーして貼り付け、repositoryMapping.setInterceptorsカスタム インターセプターを追加するための行を追加する必要がありましたUserInterceptor

もっと良い方法はありますか?

于 2015-12-16T22:37:09.847 に答える