【发布时间】:2014-05-12 22:28:04
【问题描述】:
我想实现一个 JsonP 拦截器,我正在使用 Jersey。 (我将 AsyncResponses 与长轮询一起使用,我的 REST 方法返回 'void' 因此我无法使用 @JSONP 对其进行注释)
我的问题是我不知道如何获取查询参数。我需要知道“回调”方法名称。
我还尝试了一个常规的 Servlet 过滤器。它有效,但奇怪的是我得到了methodname() {my json} 而不是
medhodname({my json}).
所以我尝试了泽西方式。好像我需要一个 WriterInterceptor,但是如何获取查询参数?
这是我的代码:
@Provider
public class JsonpResponseFilter implements WriterInterceptor {
@Override
public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException {
final String callback = (String)context.getProperty("callback");
if (null != callback) {
context.getOutputStream().write((callback+"(").getBytes());
}
context.proceed();
if (null != callback) {
context.getOutputStream().write(')');
}
}
}
编辑:
我找到了一种获取查询参数的方法,但对我来说这似乎是一种黑客行为(见下文)。必须有一些更简单或更优雅的东西。有什么想法吗?
@Provider
public class JsonpResponseFilter implements WriterInterceptor {
@Override
public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException {
final ServiceLocator locator = ServiceLocatorClientProvider.getServiceLocator(context);
ContainerRequestContext tmp = locator.getService(ContainerRequestContext.class);
List<String> callbacks = tmp.getUriInfo().getQueryParameters().get("callback");
String callback = (null == callbacks)? null:callbacks.get(0);
...
【问题讨论】:
标签: jersey jsonp jersey-2.0