前些日子我们项目需要图片验证码,图片是服务器端返回的,我就用xUtil3去加在图片,然后上传用户输入的验证码,服务器端验证一直不通过,检查发现是我这边xUtil3加载图片的时候默认把cookie给禁用了,所以服务器端无法根据cookie取得验证码的值和我上传的进行比较。我们可以看看xUtil3的bind方法。
/** * Created by wyouflf on 15/6/17. * 图片绑定接口 */ public interface ImageManager { void bind(ImageView view, String url); void bind(ImageView view, String url, ImageOptions options); void bind(ImageView view, String url, Callback.CommonCallback<Drawable> callback); void bind(ImageView view, String url, ImageOptions options, Callback.CommonCallback<Drawable> callback); Callback.Cancelable loadDrawable(String url, ImageOptions options, Callback.CommonCallback<Drawable> callback); Callback.Cancelable loadFile(String url, ImageOptions options, Callback.CacheCallback<File> callback); void clearMemCache(); void clearCacheFiles(); }
首先我们发现它的图片绑定是一个接口,接着我们就去找他的实现类
/** * Created by wyouflf on 15/10/9. */ public final class ImageManagerImpl implements ImageManager发现这个类实现了该接口,然后我们去找bind()方法@Override public void bind(final ImageView view, final String url) { x.task().autoPost(new Runnable() { @Override public void run() { ImageLoader.doBind(view, url, null, null); } }); } @Override public void bind(final ImageView view, final String url, final ImageOptions options) { x.task().autoPost(new Runnable() { @Override public void run() { ImageLoader.doBind(view, url, options, null); } }); } @Override public void bind(final ImageView view, final String url, final Callback.CommonCallback<Drawable> callback) { x.task().autoPost(new Runnable() { @Override public void run() { ImageLoader.doBind(view, url, null, callback); } }); }最后他们都调用的doBind,我们在去看doBind方法// load from Network or DiskCache return new ImageLoader().doLoad(view, url, localOptions, callback);发现它有调用了doLoad方法,该方法中有个构建请求参数的方法createRequestParams()我们发现他setUseCookie(false);
private static RequestParams createRequestParams(String url, ImageOptions options) { RequestParams params = new RequestParams(url); params.setCacheDirName(DISK_CACHE_DIR_NAME); params.setConnectTimeout(1000 * 8); params.setPriority(Priority.BG_LOW); params.setExecutor(EXECUTOR); params.setCancelFast(true); params.setUseCookie(false); if (options != null) { ImageOptions.ParamsBuilder paramsBuilder = options.getParamsBuilder(); if (paramsBuilder != null) { params = paramsBuilder.buildParams(params, options); } } return params; }所以我们只需这样final ImageOptions.ParamsBuilder builder = new ImageOptions.ParamsBuilder() {
@Override
public RequestParams buildParams(RequestParams params, ImageOptions options) {
params.setUseCookie(true);
return params;
}
};
ImageOptions options = new ImageOptions.Builder()
.setParamsBuilder(builder)
.build();就能使用cookie了