3

我有一个用例,我的应用程序托管 REST API 和 Web 应用程序,我们只需要将自定义标头添加到 REST API。REST API 是通过 Spring Data REST 启用的。通常我们可以使用 Servlet 过滤器来实现这一点,但我们需要编写将请求隔离到 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 回答