在 HTTPURLCONNECTION 和 WebView 之间共享创建的会话
Posted
技术标签:
【中文标题】在 HTTPURLCONNECTION 和 WebView 之间共享创建的会话【英文标题】:Share created session between HTTPURLCONNECTION and WebView 【发布时间】:2017-05-06 03:15:09 【问题描述】:我很难找到解决问题的方法。我使用 HttpsUrlConnection 开始从 android 到 php 文件的网络服务器会话。这是我在登录 Web 服务器时用来设置 cookie 以使会话正常工作的代码:
CookieManager cookieManager = new CookieManager();
CookieHandler.setDefault(cookieManager);
这似乎使我的会话正常工作,这正是我想要的。但是,我有一个问题。在我的应用程序的一部分中,我正在使用一个 web 视图来访问 过去 在线登录页面的页面。因此,为了让它工作,我需要以某种方式使用 HttpsUrlConnection 发送与我的 JSONObject 的会话,以便我可以绕过身份验证。
这是我用于 WebView 的代码:
webView = (WebView) findViewById(R.id.webView);
webView.getSettings().setjavascriptEnabled(true);
webView.loadUrl(URL);
它可以很好地加载页面,但它不使用 HttpsUrlConnection 使用的会话。我可以一遍又一遍地使用 HttpsUrlConnection,它会绕过身份验证,因为它使用 cookie 存储并且 php 文件会记住会话。我无法弄清楚如何在 Web 视图中以相同的方式传递这些 cookie 或会话,以便我可以正确使用该页面。
任何帮助将不胜感激。
编辑:我通过创建一个自定义 cookie 管理器类来解决这个问题,该类共享 cookiemanager 和 webview cookie 管理器的 cookie
【问题讨论】:
【参考方案1】:这是因为 WebView 有自己的 CookieStore,称为 android.net.CookieManager。你创建了一个 java.net.Cookiemanager 的实例。 他们彼此不认识。您必须在两者之间交换 cookie。
1.) 创建您自己的 java.net.CookieManager 实例,获取 android.net.CookieManager 实例:
public class MyCookieManager extends CookieManager
private android.webkit.CookieManager webkitCookieManager = null;
/**
* Constructor
* @param cookieManager android.webkit.CookieManager
* @param cookiePolicy CookiePolicy
*/
public MyCookieManager (android.webkit.CookieManager cookieManager, CookiePolicy cookiePolicy)
super(null, cookiePolicy);
this.webkitCookieManager = cookieManager;
//Cookies are allowed
this.webkitCookieManager.setAcceptCookie(true);
/**
* @param uri URI
* @param responseHeaders Map<String, List<String>>
*/
@Override
public void put(URI uri, Map<String, List<String>> responseHeaders)
if (responseHeaders == null)
return;
for (String headerKey : responseHeaders.keySet())
if ( headerKey == null || "Set-Cookie".equalsIgnoreCase(headerKey) == false)
continue;
for (String headerValue : responseHeaders.get(headerKey))
webkitCookieManager.setCookie(uri.toString(), headerValue);
/**
* @param uri URI
* @param requestHeaders Map<String, List<String>>
* @return Map<String, List<String>>
*/
@Override
public Map<String, List<String>> get(URI uri, Map<String, List<String>> requestHeaders)
if (requestHeaders == null)
return null;
Map<String, List<String>> res = new java.util.HashMap<String, List<String>>();
// get cookies from Webview CookieManager
String cookie = webkitCookieManager.getCookie(uri.toString());
if (cookie == null)
cookie = "";
res.put("Cookie", Arrays.asList(cookie));
return res;
2.) 在您的应用程序类中是这样的:
public class ApplicationWrapper extends Application
private MyCookieManager manager = null;
@Override
public void onCreate()
//some work...
this.initCookieManager();
//some more work...
private void initCookieManager ()
this.manager = new MyCookieManager(
CookieManager.getInstance(),
java.net.CookiePolicy.ACCEPT_ALL);
CookieHandler.setDefault(this.manager);
【讨论】:
以上是关于在 HTTPURLCONNECTION 和 WebView 之间共享创建的会话的主要内容,如果未能解决你的问题,请参考以下文章
android中的HttpUrlConnection的使用之三
保持 HttpUrlConnection 调用之间的会话(本机/Webview)
zz 试图将 JSON 发送到.NET web 服务使用 HttpURLConnection FileNotFoundException
Android(或者Java)通过HttpUrlConnection向SpringMVC请求数据(数据绑定)