如何在 android 中的 volley post 请求中永久放置有效的 cookie?

How to put valid cookie permanently in volley post request in android?

我正在尝试通过 android 齐射发送 POST 请求。我在 infinityfree.net 上有一个子域。我在其中上传了一个名为 Check.php 的 php 文件。

Check.php:

<?php
$response=array();
$response['value']="Returned";    
echo json_encode($response);
?>

当我尝试向此文件发送 POST 请求时,我收到一条消息

"this site requires Javascript to work, please enable Javascript in your browser or use a browser with Javascript support"

因此,我尝试在 POST 请求中放置一个 cookie(我从 chrome 获得)。我像这样覆盖了 StringRequest class 的 getHeaders() 方法:

@Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        Map<String, String> headers = super.getHeaders();
        headers.put("Cookie","__test=c25bd97d5259049875f9d7f1c990f0ea; expires=Friday, 1 January 2038 at 05:25:55; path=/");
        return headers;
}

然后我可以发送 GET 和 POST 请求并完美地获得所需的响应。问题是 运行 应用几天后,这个 cookie 值变得无用了。所以,我必须再次转到 chrome,删除旧的 cookie,打开 chrome 中的 url,然后复制新 cookie 的内容并将其粘贴到我的应用程序中的 getHeaders( ) 方法让它再次工作。几天后问题再次出现并显示相同的错误:

this site requires Javascript to work, please enable Javascript in your browser or use a browser with Javascript support

我怎样才能解决这个问题,这样我就不必在我的应用程序中手动更新 cookie?如果可能,请分享一些代码示例。

我已找到解决您问题的解决方案。所以,基本思路是这样的:

在您的应用程序打开屏幕中的所有内容后面放置一个 WebView(以便它被隐藏)。在您的域中放置一个空白 php 文件。从这个 WebView 访问这个 php 文件。接受将从服务器发送的cookie并将其存储在SharedPreferences中。您可以在应用程序的其余部分使用此 Cookie,因为此 Cookie 是新创建的。

我的示例代码:-

Sample.php:

<?php
?>

使用 WebViewCookieManager 在您的应用的 MainActivity 中存储 cookie:

String url="http://your_domain.com/Sample.php";

CookieSyncManager.createInstance(mContext);
        cookieManager=CookieManager.getInstance();
        webView.getSettings().setJavaScriptEnabled(true);

        webView.setWebViewClient(new WebViewClient(){

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);

                cookieManager.setAcceptCookie(true);
                cookie=cookieManager.getCookie(url);

                System.out.println(cookie);

                SharedPreferences sharedPreferences=getSharedPreferences("CookieDetails",MODE_PRIVATE);
                SharedPreferences.Editor editor=sharedPreferences.edit();
                editor.putString("cookieStart",cookie);
                editor.apply();

                //YOU CAN USE THE COOKIE AFTER THIS

            }
        });

        webView.setWebChromeClient(new WebChromeClient());
        webView.loadUrl(url);



        webView.clearCache(true);
        webView.clearHistory();

        cookieManager.removeAllCookie();
        cookieManager.removeSessionCookie();

像这样覆盖 StringRequest class 中的 getHeaders() 方法:

@Override
    public Map<String, String> getHeaders() throws AuthFailureError
    {
        Map<String,String> headers=new HashMap<>();
        SharedPreferences sharedPreferences=mContext.getSharedPreferences("CookieDetails",Context.MODE_PRIVATE);
        String cookieStart=sharedPreferences.getString("cookieStart","");

        headers.put("Cookie",cookieStart+"; expires=Friday, 1 January 2038 at 05:25:55; path=/");

        return headers;
    }

在此之后,您可以像往常一样发出 volley GET 和 POST 请求。

干杯!