인증 된 통신에 사용할 세션 쿠키를 Android 앱에 보내는 서버가 있습니다. 동일한 서버를 가리키는 URL로 WebView를로드하려고하는데 인증을 위해 세션 쿠키를 전달하려고합니다. 간헐적으로 작동하는 것을 관찰하고 있지만 이유를 모르겠습니다. 동일한 세션 쿠키를 사용하여 내 서버에서 다른 호출을 만들고 인증에 실패하지 않습니다. WebView에서 URL을로드하려고 할 때만이 문제가 발생하며 매번 발생하지 않습니다. 매우 실망 스럽습니다.
다음은이 작업을 수행하는 데 사용하는 코드입니다. 어떤 도움이라도 대단히 감사하겠습니다.
String myUrl = ""http://mydomain.com/";
CookieSyncManager.createInstance(this);
CookieManager cookieManager = CookieManager.getInstance();
Cookie sessionCookie = getCookie();
if(sessionCookie != null){
String cookieString = sessionCookie.getName() +"="+sessionCookie.getValue()+"; domain="+sessionCookie.getDomain();
cookieManager.setCookie(myUrl, cookieString);
CookieSyncManager.getInstance().sync();
}
WebView webView = (WebView) findViewById(R.id.webview);
webView.getSettings().setBuiltInZoomControls(true);
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new MyWebViewClient());
webView.loadUrl(myUrl);
답변
감사합니다 justingrammens ! 그것은 나를 위해 일했으며 DefaultHttpClient 요청 및 WebView 활동 내에서 쿠키를 공유했습니다.
//------- Native request activity
private DefaultHttpClient httpClient;
public static Cookie cookie = null;
//After Login
List<Cookie> cookies = httpClient.getCookieStore().getCookies();
for (int i = 0; i < cookies.size(); i++) {
cookie = cookies.get(i);
}
//------- Web Browser activity
Cookie sessionCookie = myapp.cookie;
CookieSyncManager.createInstance(this);
CookieManager cookieManager = CookieManager.getInstance();
if (sessionCookie != null) {
cookieManager.removeSessionCookie();
String cookieString = sessionCookie.getName() + "=" + sessionCookie.getValue() + "; domain=" + sessionCookie.getDomain();
cookieManager.setCookie(myapp.domain, cookieString);
CookieSyncManager.getInstance().sync();
}
답변
내 일요일을 망치는 안드로이드에 감사드립니다. . . 내 앱을 수정 한 이유는 다음과 같습니다 (웹뷰를 초기화 한 후).
if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP ) {
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptThirdPartyCookies( webView, true );
}
위의 답변이 아마도 작동 할 것이라고 말해야하지만 내 상황에서는 Android가 v5 +로 전환되는 순간 내 Android webview javascript ‘apps’가 죽었습니다.
답변
솔루션 : Webview CookieSyncManager
CookieSyncManager cookieSyncManager = CookieSyncManager.createInstance(mWebView.getContext());
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.removeSessionCookie();
cookieManager.setCookie("http://xx.example.com","mid="+MySession.GetSession().sessionId+" ; Domain=.example.com");
cookieSyncManager.sync();
String cookie = cookieManager.getCookie("http://xx.example.com");
Log.d(LOGTAG, "cookie ------>"+cookie);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.setWebViewClient(new TuWebViewClient());
mWebView.loadUrl("http://xx.example.com");
답변
해결책은 Android가 쿠키를 처리 할 수있는 충분한 시간을 제공하는 것입니다. 여기에서 자세한 정보를 찾을 수 있습니다 : http://code.walletapp.net/post/46414301269/passing-cookie-to-webview
답변
세션 쿠키를 기본 설정으로 저장하고 쿠키 관리자를 강제로 다시 채 웁니다. 활동이 다시 시작되지 않는 세션 쿠키가 들립니다.
답변
저는 3 시간의 절반 이상을 매우 유사한 문제에 대해 작업했습니다. 제 경우에는 a를 사용하여 웹 서비스를 호출 DefaulHttpClient
한 다음 .NET Framework에서 세션 및 기타 모든 해당 쿠키를 설정하고 싶었습니다 WebView
.
나는 당신의 getCookie()
방법이 무엇을하는지 모르기 때문에 이것이 당신의 문제를 해결할지 모르겠지만 제 경우에는 실제로 전화해야했습니다.
cookieManager.removeSessionCookie();
먼저 세션 쿠키를 제거한 다음 다시 추가하십시오. JSESSIONID
쿠키를 먼저 제거하지 않고 설정하려고했을 때 설정하고 싶은 값이 저장되지 않는 것을 발견했습니다. 이것이 특정 문제에 도움이 될지 확실하지 않지만 내가 찾은 것을 공유 할 것이라고 생각했습니다.
답변
얼마 동안 조사한 후이 솔루션에 도달하도록 만든 몇 가지 조각을 모았습니다. CookieSyncManager가 더 이상 사용되지 않으면 현재 Kotlin에서 웹뷰에 대한 특정 쿠키를 설정하는 가장 좋은 방법이 될 수 있습니다. 다른 것은 필요하지 않습니다.
private fun setCookie(){
val webView = WebView(this) // this = context
val cookieManager = CookieManager.getInstance()
cookieManager.acceptCookie()
val domain = "https://www.yourdomain.com/"
webView.webViewClient = WebViewClient()
webView.settings.javaScriptEnabled = true
cookieManager.setCookie(domain,"$cookieKey=$cookieValue")
cookieManager.setAcceptThirdPartyCookies(webView, true)
webView.loadUrl(domain)
}