在Android中访问Web上的受保护图像

时间:2015-09-22 23:50:40

标签: android .htaccess

假设我在某个网址(http://www.example.com/specialimages/cutepuppy.png)上有图片。此图片恰好是付费应用的一部分,我不希望人们转到此网址进行右键点击并保存。所以,我添加了htaccess密码保护。完善!它有效... URL受到保护,只有我可以使用有效的凭据访问它。 (真的,任何拥有用户名和密码的人都可以。)

接下来,在Android中,我使用Universal-Image-Loader库将我的图片加载到我的应用中。加载器代码如下所示:

ImageLoader imageLoader = ImageLoader.getInstance(); 
imageLoader.displayImage(
    "http://Validuser:Validuserpassword@www.example.com/specialimages/cutepuppy.png",
    gridViewImageHolder.imageView,
    ImageLoaderUtil.options);

Validuser:Validuserpassword是访问受htaccess保护的网址的this小技巧。除了图像加载器抛出FileNoteFoundException因为URL无效之外,所有内容都是合乎逻辑的:

09-22 16:47:30.554 19323-19365/com.example.images E/ImageLoader: http://Validuser:Validuserpassword@www.example.com/specialimages/cutepuppy.png.jpg
09-22 16:47:30.554 19323-19365/com.example.images E/ImageLoader: java.io.FileNotFoundException: http://Validuser:Validuserpassword@www.example.com/specialimages/cutepuppy.png.jpg
09-22 16:47:30.554 19323-19365/com.example.images E/ImageLoader:     at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:238)
09-22 16:47:30.554 19323-19365/com.example.images E/ImageLoader:     at com.nostra13.universalimageloader.core.download.BaseImageDownloader.getStreamFromNetwork(BaseImageDownloader.java:124)
09-22 16:47:30.554 19323-19365/com.example.images E/ImageLoader:     at com.nostra13.universalimageloader.core.download.BaseImageDownloader.getStream(BaseImageDownloader.java:88)
09-22 16:47:30.554 19323-19365/com.example.images E/ImageLoader:     at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.downloadImage(LoadAndDisplayImageTask.java:291)
09-22 16:47:30.554 19323-19365/com.example.images E/ImageLoader:     at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryCacheImageOnDisk(LoadAndDisplayImageTask.java:274)
09-22 16:47:30.554 19323-19365/com.example.images E/ImageLoader:     at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryLoadBitmap(LoadAndDisplayImageTask.java:230)
09-22 16:47:30.554 19323-19365/com.example.images E/ImageLoader:     at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.run(LoadAndDisplayImageTask.java:136)
09-22 16:47:30.554 19323-19365/com.example.images E/ImageLoader:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
09-22 16:47:30.554 19323-19365/com.example.images E/ImageLoader:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
09-22 16:47:30.554 19323-19365/com.example.images E/ImageLoader:     at java.lang.Thread.run(Thread.java:818)

那么......我的问题是什么?我想知道的是,还有另外一种方法可以做这样的事情:通过浏览器保护网页目录免受访问者的攻击,但以某种方式传递Android代码(Java)中的有效凭据,以便应用程序,只有应用程序,可以抓住图像。

修改

如果我在笔记本电脑或手机上的浏览器中使用Validuser:Validuserpassword访问我的网址(当然不是这个网址),图片加载正常...我的服务器已正确配置以处理htaccess。< / p>

1 个答案:

答案 0 :(得分:4)

根据我的理解,当您加载这样的网址时:

http://Validuser:Validuserpassword@www.example.com/specialimages/cutepuppy.png.jpg

在您的网络浏览器中,浏览器会透明地将用户/密码组件转换为HTTP Authorization请求标头。

因此,OkHttp似乎没有按照浏览器的方式执行此操作。

Universal-Image-Loader是否允许您操作请求标头,以便您自己提供此标头?

如果你可以这样做,那么你需要相应地生成它。请参阅此处的格式:

https://en.wikipedia.org/wiki/Basic_access_authentication#Client_side

看起来这个其他StackOverflow问题有一个有效的实现:

Accessing protected images in universal image loader