public class CallbackStripInterceptor implements ReaderInterceptor {
private final static byte[] callbackBytes = "callback(".getBytes();
@Override
public Object aroundReadFrom(ReaderInterceptorContext context) throws IOException, WebApplicationException {
int howMany = callbackBytes.length;
InputStream x = context.getInputStream();
if( !(x.available() >= howMany) ) {
return context.proceed();
}
x.mark( howMany );
byte[] preamble = new byte[ howMany ];
x.read( preamble );
// In case the first part of our entity doesn't have the callback String, reset the stream so downstream exploiters get the full entity.
if( !Arrays.equals( preamble, callbackBytes ) ) {
x.reset();
}
return context.proceed();
}
字符串 像这样使用:
Client c = ClientBuilder.newBuilder()
.register( new CallbackStripInterceptor() )
.build();
3条答案
按热度按时间oogrdqng1#
下面是我使用
ReaderInterceptor
提出的解决方案的一个精简版,我使用Jersey 2.x和Jackson与一个只输出JSONP的Web服务交互。字符串
像这样使用:
型
使用这个客户端,所有带有实体的响应都将通过这个拦截器(Jersey不会对没有实体主体的响应运行拦截器)。
jv4diomz2#
最后,我已经能够删除JSONP响应的回调部分。
首先,Jackson能够解析JSON,即使它以括号结尾。因此,只需从响应中删除
my_json_callback(
就足够了。由于我使用的是Apache的HTTP客户端,这解决了这个问题:
字符串
这个想法是不必将Reader转换为String,然后在删除回调部分后解析该String。
我还能够使用
json.org
库中的JSONTokener
对给定的JSONP String实现相同的结果:型
y4ekin9u3#
如果你使用伪装,你可以使用下面的解决方案。
字符串