android - 如何将有效的 cookie 永久放入 android 中的 volley post 请求中?

标签 android http post cookies android-volley

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

检查.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 类的 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 是新创建的。

我的示例代码:-

示例.php:

<?php
?>

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

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 类中的 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 请求。

干杯!

关于android - 如何将有效的 cookie 永久放入 android 中的 volley post 请求中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58143688/

相关文章:

java - html webview中的奇怪字符

Android,只有横向?

php - 如何拦截 PHP Soap 客户端的 HTTP 请求?

node.js - 如何在 Angular 2 中进行正确的 http post 调用?

android - 如何将 JSON 数据作为参数从 Android 发送到 Jersey RESTful 服务

javascript - 厌恶IE,拒绝回复JQuery Post

java - org.json.JSONException : No value for trying to parse a JSON

android - 从 Android 中的数据库填充列表

apache - 如何理解 "semantically transparent"部分RFC2616的 "Cache-Control machanism"?

google-chrome - 我如何使用谷歌浏览器找到网站的 POST 参数?