Java Android将继续使用cookies登录以获取json数据

Java Android将继续使用cookies登录以获取json数据,java,android,json,cookies,Java,Android,Json,Cookies,到目前为止,人们以不同的方式提出了这一问题,但我无法找到解决这一问题的办法 简短版本: 我正在寻找一种从需要身份验证的URL获取json的方法。我不希望每次都进行身份验证,而是希望它存储接收到的cookie,这样它就不必重新登录,并且在后续连接中保持登录状态 长版本: 基本上,我希望应用程序将用户的用户名和密码存储为具有共享首选项的内部私有字符串。然后,它将调用一个登录url进行身份验证,并在cookies中保持登录状态。完成后,我希望程序从不同的URL获取json数据,例如,这些URL要求用户

到目前为止,人们以不同的方式提出了这一问题,但我无法找到解决这一问题的办法

简短版本: 我正在寻找一种从需要身份验证的URL获取json的方法。我不希望每次都进行身份验证,而是希望它存储接收到的cookie,这样它就不必重新登录,并且在后续连接中保持登录状态

长版本: 基本上,我希望应用程序将用户的用户名和密码存储为具有共享首选项的内部私有字符串。然后,它将调用一个登录url进行身份验证,并在cookies中保持登录状态。完成后,我希望程序从不同的URL获取json数据,例如,这些URL要求用户通过cookie登录。我希望即使在应用程序暂停或销毁后,它仍保持不变。 这可以被认为是一个类似于chrome插件的想法,它可以在网站登录后简单地从网站获取数据


我认为解决这个问题的方法对许多刚接触安卓的开发者来说是很有用的。

试试看,它将用户名密码和会话存储到共享pref中

   app_preferences =    PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
    userid=app_preferences.getLong("userid",0);
    username=app_preferences.getString("username", "");

    password=app_preferences.getString("password", "");


    session=app_preferences.getString("session", "");





class task extends AsyncTask<String, integer, Boolean>{
    //httpreqclass htrq= new httpreqclass();

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        showProgressDialog();
    }

    @Override
    protected Boolean doInBackground(String... params) {
        String usr=params[0];
        String p=params[1];
        String data[]=new String[2];
    String ur=  "http://192.168.1.45/Android.asmx/Login";

        // TODO Auto-generated method stub
    data=   postData(usr,p,ur);

    boolean sucess=false;
    try {
        JSONObject jso = new JSONObject(data[0]);
        sucess =jso.getBoolean("isSucceeded");
        if (sucess) {
              SharedPreferences.Editor editor = app_preferences.edit();

            JSONObject jsr=  jso.getJSONObject("result");
            Long a= jsr.getLong("Id");
            editor.putLong("userid", a);
                editor.putString("username", usr);
                editor.putString("password", p);
                editor.putString("session", data[1]);

             editor.commit(); // Very important

        }

    }catch (Exception e){

    }

        return sucess;
    }

    @Override
    protected void onPostExecute(Boolean result) {
        // TODO Auto-generated method stub
    here put code what you want to do next


    }



}

public String[] postData(String u, String p,String url) {
    String asp = null,data = null;
    String[] rtrn=new String[2];

    //Log.e("i entrd here", "");


    try {
     HttpClient httpclient = new DefaultHttpClient(getHttpParams());
            HttpPost httppost = new HttpPost();
           HttpResponse response;
           List<NameValuePair> params = new ArrayList<NameValuePair>();                
           params.add(new BasicNameValuePair("EmailId", u));
           params.add(new BasicNameValuePair("PassWord", p));                    
           UrlEncodedFormEntity ent = new UrlEncodedFormEntity(params,HTTP.UTF_8);

    httppost.setEntity(ent);
            response = httpclient.execute(httppost);
            Header[] headers;
         headers = response.getHeaders("Set-Cookie");
            //Header atha= respone.getFirstHeader("PHPSESSID");
             List<Cookie> cookies = ((AbstractHttpClient) httpclient).getCookieStore().getCookies();

             if (cookies.isEmpty()) {
                Log.d("TAG","no cookies received");
             } else {
                for (int i = 0; i < cookies.size(); i++) {

                    if(cookies.get(i).getName().contentEquals("ASP.NET_SessionId")) {
                     asp = cookies.get(i).getValue();
                   }
                }
                Log.e("this is the cookiee", asp);
                }  





               HttpEntity entity = response.getEntity();
                InputStream is = entity.getContent();
                BufferedReader reader = new BufferedReader(new InputStreamReader(is));
                        StringBuilder sb = new StringBuilder();
                        String line = null;
                       while ((line = reader.readLine()) != null) {
                            sb.append(line + "\n");
                        }
                      is.close();
                      Log.e("", sb.toString());
                      rtrn[0]=sb.toString();
                      rtrn[1]=asp;


        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    return rtrn;

 }



private HttpParams getHttpParams() {

        HttpParams htpp = new BasicHttpParams();

        HttpConnectionParams.setConnectionTimeout(htpp, 3000);
        HttpConnectionParams.setSoTimeout(htpp, 5000);

        return htpp;
    }
您可以参考代码并按照您的逻辑创建应用程序


请注意,下次向服务器发送请求时,请不要忘记在标题中添加会话/cookie

只是为了不回答问题并解释我是如何解决问题的,下面是我的答案

我求助于使用,Instagram和Pinterest等主要应用程序都在使用

保持cookies的持久性非常简单。您所需要的只是:

AsyncHttpClient myClient=新建AsyncHttpClient;//客户端实例 PersistentCookieStore mycokieStore=新的PersistentCookieStorethis; myClient.setCookieStoreMookieStore;//设置cookie存储
首先,我应该说,非常感谢您花时间编写代码。其次,我无法运行代码,因为几乎没有问题。例如,我找不到httpreqclass、pDlg、fetchdata、showProgressDialog。。。第三,是否有任何形式的演练,或者可能是使用上述结构的最终方法。在github上为每个人提供一个工作版本可能很有用,或者我最终可以自己做,因为我认为这对很多人都很有用。再次感谢您,谢谢您。。。我将把它放在git hub上,然后添加到这里。我已经编辑了代码,别忘了将url和参数更改为您可以访问的相应的1。我已经尝试让它工作,但我仍然无法让它工作。让我解释一下问题是什么。我已修改了您的代码,以设置cookiemanager中收到的Cookie。现在我想建立一个新连接并发送cookies,但是我不知道如何在辅助连接上发送cookies。您最好使用HttpURLConnection来使用cookie manager,但该更新仅在android 2.3+上提供,对于HttpURLConnection,这取决于您希望使用的平台String addCookie=con.getHeaderFieldSet-cookie;如果你喜欢吃饼干=null{cookieManager.getInstance.setCookieurl,addCookie;}