有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

http在Android中将cookie设置为网络视图

在检查用户名或密码是否正确时,我从服务器上得到一个HttpResponse。 当我在一个webview中加载url时,我希望webView将cookie(通过postData()得到的答案)存储在webView中。 我希望webView获取cookie并加载url,其中cookie存储在webView中

我正在得到回复

public HttpResponse postData() {
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost("https://example.com/login.aspx");

    try {
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
        nameValuePairs.add(new BasicNameValuePair("txtUsername", "user"));
        nameValuePairs.add(new BasicNameValuePair("txtPassword", "123"));
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

        HttpResponse response = httpclient.execute(httppost);
        String responseAsText = EntityUtils.toString(response.getEntity());
        Log.v(TAG , "Response from req: " + responseAsText);
        return responseAsText;

    } catch (ClientProtocolException e) {

    } catch (IOException e) {

    }
    return null;
}

我加载URL时使用:

webView.loadUrl("http://a_page.com/getpage.aspx?p=home");

我想我不是真的在管理饼干,我不知道该怎么做。 有什么建议或解决方案吗


共 (3) 个答案

  1. # 1 楼答案

    只是想用另一种方式来实现这一点。不是说这是最好的,而是一种方式。您还可以使用JavaScript设置cookies。只需在WebViewClient中重写onPageFinished

    new WebViewClient() {
    
            override fun onPageFinished(view: WebView, url: String) {
    
                    val javascript = """document.cookie = "key=$value""""
    
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                        view.evaluateJavascript(javascript) { s -> Timber.d("Inject: %s", s) }
                    } else {
                        view.loadUrl("javascript:" + javascript, null)
                    }
            }
    }
    

    这种方法有一点:你必须重新加载webView。如果有人知道如何解决这个问题,请发表评论

  2. # 2 楼答案

    根据我的经验,我发现了一些让我头疼的评论:

    1. httphttpsURL是不同的。为http://www.example.com设置cookie与为https://www.example.com设置cookie不同
    2. url末尾的斜杠也会起作用。在我的例子中https://www.example.com/起作用,但https://www.example.com不起作用
    3. CookieManager.getInstance().setCookie正在执行异步操作。因此,如果在设置url后立即加载url,则不能保证cookie已经被写入。为了防止意外和不稳定的行为,请使用CookieManager#setCookie(字符串url、字符串值、ValueCallback callback)(link),并在调用回调后开始加载url

    我希望我的两分钱能节省一些人的时间,这样你就不用像我一样面对同样的问题了

  3. # 3 楼答案

    其实很简单

    String cookieString = "cookie_name=cookie_value; path=/";
    CookieManager.getInstance().setCookie(baseUrl, cookieString);
    

    其中cookieString的格式与更传统的Set-CookieHTTP头相同,baseUrl是cookie应该属于的站点