2016-12-20 1 views
0

문제점에 대한 해결책을 찾는 데 많은 어려움을 겪고 있습니다. 안드로이드에서 HttpsUrlConnection을 사용하여 PHP 파일로 웹 서버 세션을 시작합니다.HTTPURLCONNECTION과 WebView간에 공유 된 세션을 공유하십시오.

CookieManager cookieManager = new CookieManager(); 
CookieHandler.setDefault(cookieManager); 

이것은 내가 원하는 정확히 무엇이다, 제대로 내 세션 작업을 할 것 : 여기가 웹 서버에 로그인하는 동안 제대로 세션 작업을 확인하기 위해 쿠키를 설정하는 데 사용하는 코드입니다. 그러나 한 가지 문제가 있습니다. 내 응용 프로그램의 한 부분에서 과거 온라인 로그인 페이지에 액세스하는 webview를 사용하고 있습니다. 그래서 작동하려면 HttpsUrlConnection을 사용하여 JSONObject를 사용하여 세션을 보내야 인증을 무시할 수 있습니다. 여기

내가 웹보기 위해 사용하고있는 코드입니다 :

webView = (WebView) findViewById(R.id.webView); 
webView.getSettings().setJavaScriptEnabled(true);  
webView.loadUrl(URL); 

그것은 페이지 벌금을로드하지만 HttpsURLConnection에 사용하는 세션을 사용하지 않습니다. 계속해서 HttpsUrlConnection을 사용할 수 있으며 쿠키 저장소를 사용하고 PHP 파일이 세션을 기억할 때 인증을 무시합니다. 웹보기에서 이러한 쿠키 또는 세션을 동일한 방식으로 전달하는 방법을 알 수 없으므로 페이지를 올바르게 사용할 수 있습니다.

도움을 주시면 감사하겠습니다.

편집 : 나는 CookieManager에와 웹보기가 자신의 CookieStore는 android.net.CookieManager라는이 있기 때문에 년대 웹보기 쿠키 관리자

답변

1

쿠키를 공유하는 사용자 정의 쿠키 관리자 클래스를 만들어이 문제를 해결했다. 그리고 java.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) 그리고 :

1) android.net.CookieManager의 인스턴스를 가져옵니다 java.net.CookieManager의 자신의 인스턴스를 생성

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); 
} 

} 
관련 문제