1

これまでさまざまな方法で質問されてきましたが、この特定の問題に対する解決策を見つけることができません。

短いバージョン: 認証が必要な URL から json を取得する方法を探しています。また、毎回認証するのではなく、受信した Cookie を保存して、再ログインする必要がないようにし、その後の接続ではログインしたままにします。

長いバージョン: 基本的に、アプリにユーザーのユーザー名とパスワードを (共有設定を持つ内部のプライベート文字列として) 保存する必要があります。その後、ログイン URL を呼び出して認証し、ログインしたままにします (Cookie を取得します)。これが完了したら、プログラムでさまざまな URL から json データをフェッチするようにします (たとえば、ユーザーが Cookie を介してログインする必要があります)。アプリが一時停止または破棄された後でも、これをそのままにしておきたいです。ログインすると、Web サイトからデータを簡単に取得できる chrome プラグインに似たアイデアと見なすことができます。

これに対する解決策は、Android を初めて使用する多くの開発者にとって役立つと思います。

4

2 に答える 2

0

これを試して、ユーザー名パスとセッションを共有設定に保存します

   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を追加することを忘れないでください。

于 2012-08-22T12:32:21.107 に答える
0

質問を未回答のままにして、問題をどのように解決したかを説明するために、ここに私の答えがあります。

私は、Instagram や Pinterest などの主要なアプリで使用されているLoopj Android Async Http Client ライブラリを使用することにしました。

このように、Cookie を永続的に保持するのは非常に簡単です。あなたに必要なのは:

AsyncHttpClient myClient = new AsyncHttpClient(); // a client instance

PersistentCookieStore myCookieStore = new PersistentCookieStore(this);
myClient.setCookieStore(myCookieStore); // setting the cookie store
于 2014-02-22T04:24:54.223 に答える