好的,我有一个Android应用程序,里面有一个表单,两个EditText,一个微调器和一个登录按钮.用户从微调器中选择服务,键入其用户名和密码,然后单击登录.数据通过POST发送,返回响应,处理,启动新的WebView,加载响应生成的html字符串,并拥有用户选择的任何服务的主页.
这一切都很好.现在,当用户点击链接时,无法找到登录信息,并且该页面要求用户再次登录.我的登录会话正在某个地方被删除,我不确定如何将控制应用程序主要部分的类中的信息传递给刚刚启动webview活动的类.
表单登录按钮中的onClick处理程序:
private class FormOnClickListener implements View.OnClickListener { public void onClick(View v) { String actionURL, user, pwd, user_field, pwd_field; actionURL = "thePageURL"; user_field = "username"; //this changes based on selections in a spinner pwd_field = "password"; //this changes based on selections in a spinner user = "theUserLogin"; pwd = "theUserPassword"; ListmyList = new ArrayList (); myList.add(new BasicNameValuePair(user_field, user)); myList.add(new BasicNameValuePair(pwd_field, pwd)); HttpParams params = new BasicHttpParams(); DefaultHttpClient client = new DefaultHttpClient(params); HttpPost post = new HttpPost(actionURL); HttpResponse response = null; BasicResponseHandler myHandler = new BasicResponseHandler(); String endResult = null; try { post.setEntity(new UrlEncodedFormEntity(myList)); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } try { response = client.execute(post); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } try { endResult = myHandler.handleResponse(response); } catch (HttpResponseException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } List cookies = client.getCookieStore().getCookies(); if (!cookies.isEmpty()) { for (int i = 0; i < cookies.size(); i++) { cookie = cookies.get(i); } } Intent myWebViewIntent = new Intent(MsidePortal.this, MyWebView.class); myWebViewIntent.putExtra("htmlString", endResult); myWebViewIntent.putExtra("actionURL", actionURL); startActivity(myWebViewIntent); } }
这是处理响应显示的WebView类:
public class MyWebView extends android.app.Activity { private class MyWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.web); MyWebViewClient myClient = new MyWebViewClient(); WebView webview = (WebView)findViewById(R.id.mainwebview); webview.getSettings().setBuiltInZoomControls(true); webview.getSettings().setJavaScriptEnabled(true); webview.setWebViewClient(myClient); Bundle extras = getIntent().getExtras(); if(extras != null) { // Get endResult String htmlString = extras.getString("htmlString"); String actionURL = extras.getString("actionURL"); Cookie sessionCookie = MsidePortal.cookie; CookieSyncManager.createInstance(this); CookieManager cookieManager = CookieManager.getInstance(); if (sessionCookie != null) { cookieManager.removeSessionCookie(); String cookieString = sessionCookie.getName() + "=" + sessionCookie.getValue() + "; domain=" + sessionCookie.getDomain(); cookieManager.setCookie(actionURL, cookieString); CookieSyncManager.getInstance().sync(); } webview.loadDataWithBaseURL(actionURL, htmlString, "text/html", "utf-8", actionURL);} } } }
我在实施cookie解决方案方面取得了成功.它似乎适用于我登录的一项服务,我知道将cookie保留在服务器上(旧的,陈旧的,但它可以工作,他们不想改变它.)我正在尝试的服务现在需要用户保持本地计算机上的cookie,它不适用于此设置.
有什么建议?
您需要将cookie从一个调用保持到另一个调用.使用此构建器,而不是创建新的DefaultHttpClient:
private Object mLock = new Object(); private CookieStore mCookie = null; /** * Builds a new HttpClient with the same CookieStore than the previous one. * This allows to follow the http session, without keeping in memory the * full DefaultHttpClient. * @author Régis Décamps*/ private HttpClient getHttpClient() { final DefaultHttpClient httpClient = new DefaultHttpClient(); synchronized (mLock) { if (mCookie == null) { mCookie = httpClient.getCookieStore(); } else { httpClient.setCookieStore(mCookie); } } return httpClient; }
并将Builder类作为应用程序的一个字段.