如何在 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
?>
使用 WebView
和 CookieManager
在您的应用的 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 请求。
干杯!
我正在尝试通过 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
?>
使用 WebView
和 CookieManager
在您的应用的 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 请求。
干杯!