我已经看到了有关应如何与老工作答案DefaultHttpClient
但有没有一个很好的例子为HttpURLConnection
我使用HttpURLConnection
发出请求到Web应用程序。 在我的Android应用程序的开始,我用CookieHandler.setDefault(new CookieManager())
来自动与会话cookie处理,这是工作的罚款。
在登录后的某个时刻,我想表明从Web应用程序给用户用活页WebView
,而不是与下载的幕后数据HttpURLConnection
。 不过,我想用我前面建立的同一会话,以防止用户不必重新登录。
如何复制从饼干java.net.CookieManager
使用HttpURLConnection
来android.webkit.CookieManager
使用WebView
这样我就可以共享会话?
我想提出一个完全不同的方法,您的问题。 相反,从一个地方到另一个地方(手动同步)复制饼干,让我们HttpURLConnection类和网页视图使用相同的 cookie存储。
这样就完全消除了同步的需求。 在其中任何一个更新的任何cookie时,会立即自动反映到另一方。
要做到这一点,创建自己的实现java.net.CookieManager的转发到网页视图的webkit android.webkit.CookieManager所有请求。
执行:
import java.io.IOException;
import java.net.CookieManager;
import java.net.CookiePolicy;
import java.net.CookieStore;
import java.net.URI;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class WebkitCookieManagerProxy extends CookieManager
{
private android.webkit.CookieManager webkitCookieManager;
public WebkitCookieManagerProxy()
{
this(null, null);
}
WebkitCookieManagerProxy(CookieStore store, CookiePolicy cookiePolicy)
{
super(null, cookiePolicy);
this.webkitCookieManager = android.webkit.CookieManager.getInstance();
}
@Override
public void put(URI uri, Map<String, List<String>> responseHeaders) throws IOException
{
// make sure our args are valid
if ((uri == null) || (responseHeaders == null)) return;
// save our url once
String url = uri.toString();
// go over the headers
for (String headerKey : responseHeaders.keySet())
{
// ignore headers which aren't cookie related
if ((headerKey == null) || !(headerKey.equalsIgnoreCase("Set-Cookie2") || headerKey.equalsIgnoreCase("Set-Cookie"))) continue;
// process each of the headers
for (String headerValue : responseHeaders.get(headerKey))
{
this.webkitCookieManager.setCookie(url, headerValue);
}
}
}
@Override
public Map<String, List<String>> get(URI uri, Map<String, List<String>> requestHeaders) throws IOException
{
// make sure our args are valid
if ((uri == null) || (requestHeaders == null)) throw new IllegalArgumentException("Argument is null");
// save our url once
String url = uri.toString();
// prepare our response
Map<String, List<String>> res = new java.util.HashMap<String, List<String>>();
// get the cookie
String cookie = this.webkitCookieManager.getCookie(url);
// return it
if (cookie != null) res.put("Cookie", Arrays.asList(cookie));
return res;
}
@Override
public CookieStore getCookieStore()
{
// we don't want anyone to work with this cookie store directly
throw new UnsupportedOperationException();
}
}
最后通过对您的应用程序初始化这样使用它:
android.webkit.CookieSyncManager.createInstance(appContext);
// unrelated, just make sure cookies are generally allowed
android.webkit.CookieManager.getInstance().setAcceptCookie(true);
// magic starts here
WebkitCookieManagerProxy coreCookieManager = new WebkitCookieManagerProxy(null, java.net.CookiePolicy.ACCEPT_ALL);
java.net.CookieHandler.setDefault(coreCookieManager);
由于相比DefaultHttpClient
,还有一些额外的步骤。 关键的区别是如何访问现有的Cookie在HTTPURLConnection
:
- 呼叫
CookieHandler.getDefault()
并将结果转换到java.net.CookieManager
。 - 随着cookie管理器,调用
getCookieStore()
来访问cookie存储。 - 随着cookie存储,调用
get()
来访问Cookie在给定的列表URI
。
这里有一个完整的例子:
@Override
protected void onCreate(Bundle savedInstanceState) {
// Get cookie manager for WebView
// This must occur before setContentView() instantiates your WebView
android.webkit.CookieSyncManager webCookieSync =
CookieSyncManager.createInstance(this);
android.webkit.CookieManager webCookieManager =
CookieManager.getInstance();
webCookieManager.setAcceptCookie(true);
// Get cookie manager for HttpURLConnection
java.net.CookieStore rawCookieStore = ((java.net.CookieManager)
CookieHandler.getDefault()).getCookieStore();
// Construct URI
java.net.URI baseUri = null;
try {
baseUri = new URI("http://www.example.com");
} catch (URISyntaxException e) {
// Handle invalid URI
...
}
// Copy cookies from HttpURLConnection to WebView
List<HttpCookie> cookies = rawCookieStore.get(baseUri);
String url = baseUri.toString();
for (HttpCookie cookie : cookies) {
String setCookie = new StringBuilder(cookie.toString())
.append("; domain=").append(cookie.getDomain())
.append("; path=").append(cookie.getPath())
.toString();
webCookieManager.setCookie(url, setCookie);
}
// Continue with onCreate
...
}
我奇迹般地解决了在此的onCreate一行所有我的cookie的问题:
CookieHandler.setDefault(new CookieManager());
我有同样的问题,这是我的解决方案:
刚登录后(这一点很重要,因为之前,你可能没有饼干还)使用HttpURLConnection的POST(后getResponseCode),我做的:
responseCode = connexion.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
final String COOKIES_HEADER = "Set-Cookie";
cookie = connexion.getHeaderField(COOKIES_HEADER);
...
}
(其中Cookie是在我的类中的公共字符串)
而在web视图的活动,在这里我想用的WebView显示来自服务器的网页,我做的:
String url = "http://toto.com/titi.html"; // the url of the page you want to display
CookieSyncManager.createInstance(getActivity());
CookieSyncManager.getInstance().startSync();
android.webkit.CookieManager cookieManager = android.webkit.CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.removeSessionCookie();
cookieManager.setCookie(url, cookie);
CookieSyncManager.getInstance().sync();
由于我的web视图是一个片段,我不得不使用getActivity()的情况下,我也必须指定android.webkit。 前CookieManager否则就不能得到解决(进口java.net而不是android.webkit cookie管理器)。
Cookie是相同的字符串如上述(在我的片段,我不得不使用恢复它:
cookie = getArguments().getString(COOKIE);
在我的MainActivity,我通过发送:
Bundle arg = new Bundle();
arg.putString(Fragment_Cameras.COOKIE, cookie);
fragment.setArguments(arg);
我跳这可以帮助!
文章来源: Pass cookies from HttpURLConnection (java.net.CookieManager) to WebView (android.webkit.CookieManager)