2016-12-20 27 views
0

私の問題の解決策を見つけるのには非常に苦労しています。私は、HttpsUrlConnectionを使用して、アンドロイドからPHPファイルへのWebサーバーセッションを開始します。HTTPURLCONNECTIONとWebViewの間で作成されたセッションを共有します

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

これは私が望んでいたまさにである、正しく私のセッションの仕事をするようだ:ここで私は、Webサーバーへのログイン時に正しくセッションの仕事をするためにクッキーを設定するために使用するコードです。しかし、私は1つの問題があります。私のアプリのある部分では、、ログインページをオンラインにしたページにアクセスするwebviewを使用しています。ですから、それを動作させるために、私は何とかHttpsUrlConnectionを使って私のJSONObjectでセッションを送って認証をバイパスする必要があります。ここで

は、私はWebViewのために使用していますコードです:

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

それは罰金ページをロードするが、それはHttpsURLConnectionのが使用するセッションを使用していません。私はHttpsUrlConnectionを何度も使用することができ、Cookieストレージを使用するので認証をバイパスし、PHPファイルはセッションを記憶します。私はこれらのクッキーやセッションをWebビューで同じ方法で渡す方法を理解することができず、ページを適切に使用することができます。

ご協力いただければ幸いです。

編集:私は、WebViewのはandroid.net.CookieManagerと呼ばれる独自のは、cookiestoreを持っているためだcookiemanagerとWebViewのクッキーマネージャ

答えて

1

のクッキーを共有するカスタムクッキーマネージャクラスを作成することによって、これを解決しました。そして、java.net.Cookiemanagerのインスタンスを作成しました。 彼らはお互いを知らない。両方の間でクッキーを入れ替える必要があります。

1)android.net.CookieManagerのインスタンスを取得します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)を、アプリケーションクラスでこのような何か:

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

} 
関連する問題