Restlet + JAXRS 扩展 - 如何使用过滤器?
Restlet + JAXRS extension - how to use filters?
我有一个在 Restlet + JAXRS 扩展中实现的 REST 服务。
在某个时候,我不得不将 CORS headers 添加到响应中。
我有很多 REST 调用,并在工作时手动添加 headers:
return Response.status(200).header("Access-Control-Allow-Origin", "*").
header("Access-Control-Allow-Headers", "Authorization, Origin, X-Requested-With, Content-Type").
header("Access-Control-Expose-Headers", "Location, Content-Disposition").
header("Access-Control-Allow-Methods", "POST, PUT, GET, DELETE, HEAD, OPTIONS").
entity(fsJSON).build();
但我想使用过滤器将 headers 添加到所有回复中,而不是手动添加。我在 JAX-RS 中找到了很多使用过滤器的示例,例如:
https://jersey.java.net/documentation/latest/filters-and-interceptors.html
http://javatech-blog.blogspot.it/2015/04/jax-rs-filters-example.html
http://blog.dejavu.sk/2014/02/04/filtering-jax-rs-entities-with-standard-security-annotations/
但我不明白如何将它们与 Restlet + JAX-RS 环境集成。例如,我在任何地方都看不到 ContainerResponseFilter class。
谁能帮帮我?
在 Restlet 中创建 JaxRS 应用程序时,您会创建一个 JaxRsApplication
(参见 link:http://restlet.com/technical-resources/restlet-framework/guide/2.2/extensions/jaxrs)。这个class扩展了Restlet的标准应用。后者提供了使用 getServices
方法在其上配置服务的方法。
所以在你的情况下,你不需要使用过滤器...
关于Restlet的CorsService的配置见这个回答:How to use CORS in Restlet 2.3.1?。
这是一种在 Restlet JaxRS 应用程序中配置 CORS 的方法:
Component comp = new Component();
Server server = comp.getServers().add(Protocol.HTTP, 8182);
JaxRsApplication application = new JaxRsApplication(comp.getContext());
application.add(new ExampleApplication());
CorsService corsService = new CorsService();
corsService.setAllowedOrigins(new HashSet(Arrays.asList("*")));
corsService.setAllowedCredentials(true);
application.getServices().add(corsService);
component.getDefaultHost().attachDefault(application);
否则,Restlet 的相应扩展不支持 JAX-RS 过滤器。添加过滤器需要在应用程序前面添加为Restlet过滤器,如下所述:
JaxRsApplication application = new JaxRsApplication(comp.getContext());
application.add(new ExampleApplication());
MyRestletFilter filter = new MyRestletFilter();
filter.setNext(application);
component.getDefaultHost().attachDefault(filter);
希望对你有帮助,
蒂埃里
我有一个在 Restlet + JAXRS 扩展中实现的 REST 服务。 在某个时候,我不得不将 CORS headers 添加到响应中。 我有很多 REST 调用,并在工作时手动添加 headers:
return Response.status(200).header("Access-Control-Allow-Origin", "*").
header("Access-Control-Allow-Headers", "Authorization, Origin, X-Requested-With, Content-Type").
header("Access-Control-Expose-Headers", "Location, Content-Disposition").
header("Access-Control-Allow-Methods", "POST, PUT, GET, DELETE, HEAD, OPTIONS").
entity(fsJSON).build();
但我想使用过滤器将 headers 添加到所有回复中,而不是手动添加。我在 JAX-RS 中找到了很多使用过滤器的示例,例如:
https://jersey.java.net/documentation/latest/filters-and-interceptors.html
http://javatech-blog.blogspot.it/2015/04/jax-rs-filters-example.html
http://blog.dejavu.sk/2014/02/04/filtering-jax-rs-entities-with-standard-security-annotations/
但我不明白如何将它们与 Restlet + JAX-RS 环境集成。例如,我在任何地方都看不到 ContainerResponseFilter class。 谁能帮帮我?
在 Restlet 中创建 JaxRS 应用程序时,您会创建一个 JaxRsApplication
(参见 link:http://restlet.com/technical-resources/restlet-framework/guide/2.2/extensions/jaxrs)。这个class扩展了Restlet的标准应用。后者提供了使用 getServices
方法在其上配置服务的方法。
所以在你的情况下,你不需要使用过滤器...
关于Restlet的CorsService的配置见这个回答:How to use CORS in Restlet 2.3.1?。
这是一种在 Restlet JaxRS 应用程序中配置 CORS 的方法:
Component comp = new Component();
Server server = comp.getServers().add(Protocol.HTTP, 8182);
JaxRsApplication application = new JaxRsApplication(comp.getContext());
application.add(new ExampleApplication());
CorsService corsService = new CorsService();
corsService.setAllowedOrigins(new HashSet(Arrays.asList("*")));
corsService.setAllowedCredentials(true);
application.getServices().add(corsService);
component.getDefaultHost().attachDefault(application);
否则,Restlet 的相应扩展不支持 JAX-RS 过滤器。添加过滤器需要在应用程序前面添加为Restlet过滤器,如下所述:
JaxRsApplication application = new JaxRsApplication(comp.getContext());
application.add(new ExampleApplication());
MyRestletFilter filter = new MyRestletFilter();
filter.setNext(application);
component.getDefaultHost().attachDefault(filter);
希望对你有帮助, 蒂埃里