簡體   English   中英

如何使用AsyncTask發送Cookie?

[英]How to send cookies with AsyncTask?

我有一個Web服務器,我在其中登錄了android應用程序,在登錄之后,我將XML身份接收了使用名為token的字段登錄的用戶。

該令牌用於在下次調用webService期間保持打開會話的狀態,並且該令牌以名為“ acrsession”的cookie的形式工作,但該令牌似乎無效,因為每次我嘗試檢查即時消息是否已登錄(使用名為currentUser的get調用) )它禁止我返回,所以我認為它不能很好地工作。

這是我的AsyncTask類,負責對服務器的調用。

public String getFileName() {
        return FileName;
    }
    public void setFileName(String fileName) {
        FileName = fileName;
    }
    private String Response;
    private URI uriInfo;
    private String FileName;

    public WebServiceTask(int taskType, Context mContext, String processMessage,String token) {

        this.taskType = taskType;
        this.mContext = mContext;
        this.processMessage = processMessage;
        this.token=token;
    }


    public void addNameValuePair(String name, String value) {
        params.add(new BasicNameValuePair(name, value));
    }

    public void showProgressDialog() {  
        pDlg = new ProgressDialog(mContext);
        pDlg.setMessage(processMessage);
        pDlg.setProgressDrawable(mContext.getWallpaper());
        pDlg.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        pDlg.setCancelable(false);
        pDlg.show();
    }


    @Override
    protected void onPreExecute() {
        //hideKeyboard();
        showProgressDialog();
    }


    protected String doInBackground(String... urls) {
        String url = urls[0];
        String result = "";
        HttpResponse response = doResponse(url);
        if (response == null) {
            return result;
        } else {
            try {
                result = inputStreamToString(response.getEntity().getContent());

            } catch (IllegalStateException e) {
                Log.e(TAG, e.getLocalizedMessage(), e);

            } catch (IOException e) {
                Log.e(TAG, e.getLocalizedMessage(), e);
            }

        }

        return result;
    }

    @Override
    protected void onPostExecute(String response) {     
        this.Response=response;
        pDlg.dismiss();
    }

    // Establish connection and socket (data retrieval) timeouts
    private HttpParams getHttpParams() {   
        HttpParams htpp = new BasicHttpParams();   
        HttpConnectionParams.setConnectionTimeout(htpp, CONN_TIMEOUT);
        HttpConnectionParams.setSoTimeout(htpp, SOCKET_TIMEOUT);   
        return htpp;
    }

    private HttpResponse doResponse(String url) {         
        // Use our connection and data timeouts as parameters for our
        // DefaultHttpClient
        HttpClient httpclient = new DefaultHttpClient(getHttpParams());
        int responseCode=0;
        // Create a local instance of cookie store
        //CookieStore cookieStore = new BasicCookieStore();     
        // Create local HTTP context
        //HttpContext localContext = new BasicHttpContext();
        // Bind custom cookie store to the local context
        //localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore); 
        //CookieManager cookieManager= CookieManager.getInstance();
        this.getLocalContext();


        this.cookieStore.addCookie(new BasicClientCookie("acrsession", this.token));

        HttpResponse response = null; 
        try {
            switch (taskType) {

            case POST_TASK:
                HttpPost httppost = new HttpPost(url);
                // Add parameters
                httppost.setEntity(new UrlEncodedFormEntity(params));
                int executeCount = 0;
                do
                {
                    pDlg.setMessage("Logging in.. ("+(executeCount+1)+"/5)");
                    // Execute HTTP Post Request
                    executeCount++;
                    response = httpclient.execute(httppost,localContext);
                    responseCode = response.getStatusLine().getStatusCode();            
                    // If you want to see the response code, you can Log it
                    // out here by calling:
                    // Log.d("256 Design", "statusCode: " + responseCode)
                } while (executeCount < 5 && responseCode == 408);          
                uriInfo = httppost.getURI();               
                break;
            case GET_TASK:
                HttpGet httpget = new HttpGet(url);
                response = httpclient.execute(httpget,localContext);
                responseCode = response.getStatusLine().getStatusCode();
                httpget.getRequestLine();
                uriInfo = httpget.getURI();                    
                break;
            case PUT_TASK:
                HttpPut httpput = new HttpPut(url);
                File file = new File(this.FileName);
                InputStreamEntity reqEntity = new InputStreamEntity(new FileInputStream(file), -1);
                reqEntity.setContentType("binary/octet-stream");
                reqEntity.setChunked(true); // Send in multiple parts if needed
                httpput.setEntity(reqEntity);
               response = httpclient.execute(httpput,localContext);
                responseCode = response.getStatusLine().getStatusCode();
                httpput.getRequestLine();
                uriInfo = httpput.getURI();                    
                break;
            }
        } catch (Exception e) {
            Log.e(TAG, e.getLocalizedMessage(), e);
        }
        return response;
    }

    private String inputStreamToString(InputStream is) {
        String line = "";
        StringBuilder total = new StringBuilder();
        // Wrap a BufferedReader around the InputStream
        BufferedReader rd = new BufferedReader(new InputStreamReader(is));
        try {
            // Read response until the end
            while ((line = rd.readLine()) != null) {
                total.append(line);
            }
        } catch (IOException e) {
            Log.e(TAG, e.getLocalizedMessage(), e);
        }
        // Return full string
        this.Response=total.toString();
        return total.toString();
    }
    public String getResponse(){
        return this.Response;
    }
    public HttpContext getLocalContext()
    {

        if (localContext == null)
        {
            localContext = new BasicHttpContext();
            cookieStore = new BasicCookieStore();
            localContext.setAttribute(ClientContext.COOKIE_ORIGIN, cookieStore);
            localContext.setAttribute(ClientContext.COOKIE_SPEC, cookieStore);
            localContext.setAttribute(ClientContext.COOKIESPEC_REGISTRY, cookieStore);
            localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);// to make sure that cookies provided by the server can be reused
        }
        return localContext;
    }

Plesae告訴我即時消息做得不好。

提前致謝。

好吧,終於我找到了解決方案,一切正常,但是我忘記設置cookie域和路徑,所以一旦我把它設置為有效。

現在,cookie的創建如下所示:

this.localContext=this.getLocalContext();
BasicClientCookie cookie = new BasicClientCookie("acrsession", this.token);
cookie.setDomain(this.Domain);
cookie.setPath(this.path);
this.cookieStore.addCookie(cookie);
 localContext.setAttribute(ClientContext.COOKIE_STORE, this.cookieStore);

希望它會幫助別人。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM