在Jersey中实现JSONP拦截器

时间:2014-05-12 22:28:05

标签: jersey jsonp jersey-2.0

我想实现一个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);
        ...

1 个答案:

答案 0 :(得分:1)

一个不太常见的解决方案是在您的班级中将提供者作为一个字段注入:

@Inject
private Provider<ContainerRequest> containerRequestProvider;

从这里,你可以访问这样的查询参数:

final ContainerRequest containerRequest = containerRequestProvider.get();
final UriInfo uriInfo = containerRequest.getUriInfo();
final MultivaluedMap<String, String> queryParameters = uriInfo.getQueryParameters();
final List<String> queryParameter = queryParameters.get("q");
...