我的服务器使用原生谷歌+登录oauth2令牌回复,我正在设置cookie:
String cookieSessionString = "JSESSIONID" + "=" + i.getStringExtra("C_session_id");
String cookieEmailString = "useremail" + "=" + i.getStringExtra("C_user_email");
String cookieNameString = "username" + "=" + i.getStringExtra("C_user_name");
String cookieUseridString = "userid" + "=" + i.getStringExtra("C_user_id");
CookieManager cookieManager = CookieManager.getInstance();
CookieSyncManager cookieSyncManager = CookieSyncManager.createInstance(webView.getContext());
cookieManager.setCookie("mydomain.co", cookieSessionString);
cookieManager.setCookie("mydomain.co", cookieEmailString);
cookieManager.setCookie("mydomain.co", cookieNameString);
cookieManager.setCookie("mydomain.co", cookieUseridString);
cookieManager.setAcceptCookie(true);
cookieSyncManager.getInstance().sync();
在webview中我打电话:
webView.getSettings().setAppCacheEnabled(true);
WebViewDatabase.getInstance(this).clearHttpAuthUsernamePassword();
webView.getSettings().setDatabaseEnabled(true);
webView.getSettings().setDomStorageEnabled(true);
webSettings.getCacheMode();
webView.loadUrl(base_url);
webView.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
startActivity(new Intent(MainActivity.this, NoDataActivity.class).putExtra("Activity", "Main.class"));
super.onReceivedError(view, errorCode, description, failingUrl);
}
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
@Override
public void onLoadResource( WebView view, String url ){
CookieManager cookieManager = CookieManager.getInstance();
cookie = cookieManager.getCookie(url);
Log.d("ONloadResource","cookie is"+cookie);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setCookie(url, cookie);
progressBar.setVisibility(View.GONE);
progressBar.setProgress(100);
if (url.contains("/ccavResponseHandler.jsp")) {
webView.loadUrl("javascript:window.HTMLOUT.processHTML ('<head>'+document.getElementsByTagName('html')[0].innerHTML+'</head>');");
}
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
progressBar.setVisibility(View.VISIBLE);
progressBar.setProgress(5);
}
});
还尝试发送标题:
extraHeaders.put("JSESSIONID", i.getStringExtra("C_session_id"));
extraHeaders.put("username", i.getStringExtra("C_user_name"));
extraHeaders.put("useremail", i.getStringExtra("C_user_email"));
webView.loadUrl(url, extraHeaders);`
没有在webview登录中工作..!
任何人都可以帮我解决这个问题,如何在我的域名网址中使用会话ID和用户电子邮件,id在webview中登录。
答案 0 :(得分:1)
您可能在Android中发现的事情是Web身份验证。大多数网站发布cookie来跟踪会话ID并保持用户登录。为了维护此身份验证,您需要在活动之间以及http客户端和Web视图之间保持Cookie同步。
我最终做的方法,似乎工作得很好,是创建一个扩展Application的类,然后定义一个HttpClient,用于整个Application的其余部分。该代码如下:
public class AppSettings extends Application {
private static final DefaultHttpClient client = createClient();
@Override
public void onCreate(){
}
static DefaultHttpClient getClient(){
return client;
}
private static DefaultHttpClient createClient(){
BasicHttpParams params = new BasicHttpParams();
SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
final SSLSocketFactory sslSocketFactory = SSLSocketFactory.getSocketFactory();
schemeRegistry.register(new Scheme("https", sslSocketFactory, 443));
ClientConnectionManager cm = new ThreadSafeClientConnManager(params, schemeRegistry);
DefaultHttpClient httpclient = new DefaultHttpClient(cm, params);
httpclient.getCookieStore().getCookies();
return httpclient;
}
该类还创建了一个适用于AsyncTasks并同时发出多个http请求的HttpClient。对于ClientConnectionManager使用ThreadSafeClientConnManager,您可以在AsyncTasks中运行http请求,而不会在按下后退按钮并启动第二个或第三个时强制关闭。
它还会创建一个可在您的所有活动中访问的默认Cookie存储。您可以通过调用getClient()方法在其他活动中使用它。
例如
public class SomeActivity extends Activity {
static DefaultHttpClient mClient = AppSettings.getClient();
...
try {
HttpGet httpget = new HttpGet('URL');
HttpResponse response;
response = mClient.execute(httpget);
...
}
...
}
如果您发现有必要使用webview并且需要它来访问和使用与您的客户相同的cookie。您可以使用CookieManager同步客户端的cookie存储:(在onPageStarted方法中)
DefaultHttpClient mClient = AppSettings.getClient();
Cookie sessionInfo;
List<Cookie> cookies = mClient.getCookieStore().getCookies();
if (! cookies.isEmpty()){
CookieSyncManager.createInstance(getApplicationContext());
CookieManager cookieManager = CookieManager.getInstance();
for(Cookie cookie : cookies){
sessionInfo = cookie;
String cookieString = sessionInfo.getName() + "=" + sessionInfo.getValue() + "; domain=" + sessionInfo.getDomain();
cookieManager.setCookie("example.com", cookieString);
CookieSyncManager.getInstance().sync();
}
}
您需要使用正确的域名切换example.com。