android - 在 Android 中访问 Web 上 protected 图像

标签 android .htaccess

假设我在某个 URL (http://www.example.com/specialimages/cutepuppy.png) 有一张图片。此图像恰好是付费应用程序的一部分,我不希望人们转到此 URL 以右键单击并保存。所以,我添加了 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:Validuserpasswordthis访问受 htaccess 保护的 URL 的小技巧。除了图像加载器抛出 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)

那么...我的问题是什么?我想知道的是,是否还有另一种方法可以做这样的事情:通过浏览器保护 Web 目录免受访问者的访问,但以某种方式在 Android 代码(Java)中传递有效的凭据,以便该应用程序(并且只有该应用程序)可以获取图片。

编辑

如果我在我的笔记本电脑或手机上的浏览器中访问我的 URL(当然不是这个),在它之前使用 Validuser:Validuserpassword,图像加载正常......我的服务器配置正确处理 htaccess。

最佳答案

据我所知,当您加载这样的 URL 时:

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

在您的 Web 浏览器中,浏览器透明地将用户/密码组件转换为 HTTP Authorization 请求 header 。

因此,OkHttp 似乎没有像您的浏览器那样执行此操作。

Universal-Image-Loader 是否允许您操纵请求 header 以便您可以自己提供此 header ?

如果可以,则需要相应地生成它。请参阅此处的格式:

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

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

Accessing protected images in universal image loader

关于android - 在 Android 中访问 Web 上 protected 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32728875/

相关文章:

apache - 为 Google 抓取提供的不同页面

css - @font-face 和 Header 设置 Access-Control-Allow-Origin "*"

android - 连接到手机后,Android Auto 媒体应用程序如何显示?

Android本地化问题: Not all items in the layout update properly when switching locales

.htaccess - 在子文件夹中重写不适用于 Drupal 7 的规则

html - 有没有办法用 htaccess 文件更改页面的内容?

android - 从自定义选项卡重定向到应用

android - 没有api_key的 fragment 中的谷歌地图

android - 无法加载共享库,因为主要编号作为库依赖项的一部分给出

.htaccess - 内容安全策略 header - 升级不安全请求和报告事件