Java Android获取url,需要登录

Java Android获取url,需要登录,java,android,urlfetch,Java,Android,Urlfetch,我想从包含一些json数据的网页中获取数据。问题是,json数据仅在用户登录网站时返回。如果他不是,则返回登录页面 URL url = new URL(API_URL); URLConnection conn = url.openConnection(); BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream))); StringBuilder builder = new StringB

我想从包含一些json数据的网页中获取数据。问题是,json数据仅在用户登录网站时返回。如果他不是,则返回登录页面

URL url = new URL(API_URL);
URLConnection conn = url.openConnection();

BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream)));
StringBuilder builder = new StringBuilder();
String line = "";

while ((line = br.readLine()) != null) {
    builder.append(line + System.getProperty("line.separator"));
}
String result = builder.toString();
因此,在
result
中,我希望有json数据。但我有一个登录页面。我尝试从浏览器登录,但没有帮助


如何使用浏览器中的Cookie访问此登录页面?

如果您使用的是Java SE,我建议您使用Apache HttpClient库。它支持各种身份验证,包括使用会话cookie基于表单的登录。我不知道这对Android来说是否是一个好的建议

编辑

我没有注意到真正的问题是访问浏览器cookies

1:您是否尝试过使用或获取浏览器的cookiemanager实例

2:是否可以将您的应用程序(或其中的一部分)编写为webkit插件,以便它可以通过这种方式访问cookie?(我对webkit/android了解不够,不知道这是否有意义。)

3:如果你不能做到这一点,你可以把你的应用程序写成一个web代理,让它在cookies通过时“窃取”cookies。(但这听起来不是个好主意。存在安全和隐私问题,以及可能干扰正常浏览器功能的问题。)

4:最后,还有一个回退选项,即编写应用程序以自己登录并管理自己的会话cookie。问题在于,您无法避免将应用程序特定于远程网站的登录方式

跟进

@Daniel Trebbien的回答认为,出于安全原因,选项1:不是一个起点。这是有道理的。(如果一个应用可以访问另一个应用的cookie,那么浏览器安全性将不存在。)

虽然Android确实提供了一个插件API,但它已被弃用,我看到一位Android工程师的帖子说,不鼓励第三方代码使用它。这几乎使选项2成为一条死胡同

选项3:将要求用户配置其手机浏览器以将您的应用程序用作代理。。。他们可能不应该这么做

其他两个要考虑的选项是:

5:以Javascript作为NPAPI浏览器插件实现应用程序的功能


6:使用WebView为应用程序提供自己的(精简的)web浏览器。您的应用程序自然可以完全访问自己的CookieManager实例。

如果可以从浏览器应用程序中获取任意cookie或通过浏览器下载数据,那么我会非常担心,因为这些都是严重的安全缺陷。假设有人登录BankOfAmerica.com,应用程序能够检查BankOfAmerica.com会话cookie或通过浏览器下载BankOfAmerica.com页面。无论哪种情况,该应用程序都可以作为登录的个人执行网上银行操作


简单的回答是,你的应用程序需要询问用户的登录信息。然后,您可以将
HttpClient
与您自己的cookie存储一起使用来登录用户。

我如何从android浏览器获取cookie?@folone:我已经找到了,但看起来您无法。您必须创建自己的cookie实例,然后将其绑定到您的
HttpClient
。我想最后一个是我的选择。@folone-如果您的代码是webkit插件,那么我认为CookieManager.getInstance()应该为您提供浏览器的cookie存储。查看浏览器应用程序的源代码,它使用CookieManager#getInstance(上下文)()设置
CookieManager.getInstance()
返回的
CookieManager
实例。由于每个应用程序都有自己的
上下文
,我认为这意味着
CookieManager.getInstance()
返回的
CookieManager
实例对于每个应用程序都是不同的。是的,这非常有意义。