如何在android WebView客户端中设置cookie

时间:2015-10-14 08:39:52

标签: android cookies webview asynchttpclient

我想通过 WebView 调用一个特定网址。该页面只能在用户登录后调用。我使用 AsyncHttpClient 库执行登录调用。成功登录后,通过 WebView 加载网址似乎无法识别正确的标头esp cookie。我怀疑是在 HttpClient WebView的HttpClient 之间cookie没有正确同步。知道为什么吗? 。以下是我使用 WebView

的方法
    final WebView webView = (WebView) content.findViewById(R.id.web_travel_advisory);
    String url = "http://mydomainurl.com/get_data_after_login";

    webView.setWebViewClient(new WebViewClient());

    CookieSyncManager.createInstance(getActivity());
    CookieSyncManager.getInstance().startSync();
    CookieManager.getInstance().setAcceptCookie(true);

    webView.getSettings().setJavaScriptEnabled(true);

    webView.loadUrl(url);

感谢你的帮助。

3 个答案:

答案 0 :(得分:25)

几个小时后,我终于想通了它才能让它运转起来。首先,根据doc,自api 21以来,CookieSyncManager在Android的更新版本上被弃用。因此决定不再使用它了。其次CookieManager用于存储 WebView 的Cookie。

最终代码

    CookieManager cookieManager = CookieManager.getInstance();
    cookieManager.setAcceptCookie(true);

    List<Cookie> cookies = WSHelper.cookieStore.getCookies();

    cookieManager.removeAllCookie();

    if (cookies != null) {
        for (Cookie cookie : cookies) {
            if (cookie.getName().contains("session")){
                String cookieString = cookie.getName() + "=" + cookie.getValue() + "; Domain=" + cookie.getDomain();
                cookieManager.setCookie(cookie.getDomain(), cookieString);
                Log.d("CookieUrl",cookieString + " ");
            }
        }
    }
    webView.loadUrl(url);

解决方案的主要变化是:使用 cookie.getDomain()而不是显式域。

cookieManager.setCookie(cookie.getDomain(), cookieString);

答案 1 :(得分:3)

尝试此代码后,我可以进行一些更改:

public class WebViewActivity extends Activity{
    private SharedPreferences mPreferences;

    String token="";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.webviewpage);

        mPreferences = getSharedPreferences("CurrentUser", MODE_PRIVATE);

    }

    public void LaunchWebView(View view) {

        WebView myWebView = (WebView) findViewById(R.id.myWebView);
        myWebView.getSettings().setJavaScriptEnabled(true);
        myWebView.getSettings().setSaveFormData(false);

        CookieSyncManager.createInstance(this);
        CookieSyncManager.getInstance().startSync();
        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.setAcceptCookie(true);
        CookieManager.getInstance().setAcceptThirdPartyCookies(myWebView, true);

        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
        String token2= mPreferences.getString("auth_token","");

        HashMap<String, String> map = new HashMap<String, String>();
        map.put("x-auth-token", token);

        myWebView.getSettings().setAppCacheEnabled(true);
        myWebView.setWebViewClient(new WebViewClient() {
            public boolean shouldOverrideUrlLoading(WebView view,String url) {
                view.loadUrl(url);
                return true;
            }
        });
        myWebView.loadUrl("YOUR_URL", map);
    }
}

答案 2 :(得分:0)

我的问题略有不同,但是@Tixeon的回答给了我解决的关键。我正在编写Cookie并将其添加到WebView请求中,但是我发现Android覆盖了Cookie并发送了自己的Cookie。 因此,首先,我必须从阵列中删除所有cookie,然后编写自己的cookie。这是示例代码:

    render() {

return (
  <Container>


    <Tabs renderTabBar={() => <ScrollableTab  style={{ backgroundColor: '#4169E1' }} />} >
      <Tab
        heading={<TabHeading style={{ backgroundColor: '#4169E1' }}>
          <Icon name="home" style={{ color: 'white' }} />
        </TabHeading>}>

        <Text> This is Home </Text>


      </Tab>
      <Tab
        heading={<TabHeading style={{ backgroundColor: '#4169E1' }} >
          <Icon name="ios-search" style={{ color: 'white' }} />
        </TabHeading>}>
        <Text> This is Search </Text>

      </Tab>

      <Tab
        heading={<TabHeading style={{ backgroundColor: '#4169E1' }} >

          <SimpleLineIcons name='user' color='white' size={25} style={{ marginLeft: 20 }} />
        </TabHeading>}>

        <Text> THis is User </Text>


      </Tab>

      <Tab
        heading={<TabHeading style={{ backgroundColor: '#4169E1' }} >
          <Icon name="help" style={{ color: 'white' }} />
        </TabHeading>}>
        <Texy> </Text>
      </Tab>

      <Tab
        heading={<TabHeading style={{ backgroundColor: '#4169E1' }} >
          <Icon name="cog" style={{ color: 'white' }} />
        </TabHeading>}>
        <Settings />
      </Tab>
    </Tabs>
  </Container>

现在,该请求包含我的Cookie,而不是Android提供的默认Cookie,并且我在WebView中的会话正在运行。希望这对别人有帮助