2010-11-02 43 views
25

Trong ứng dụng Android của tôi, mỗi hoạt động được lấp đầy với dữ liệu từ tệp xml ở đâu đó trên web. Trang web cung cấp những tệp này có cơ chế đăng nhập, hoạt động với cookie.Android: Cách lưu trữ cookie?

Tôi biết cách thực hiện Yêu cầu HTTP đến trang đăng nhập và nhận cookie. Những gì tôi không biết là, làm thế nào tôi có thể lưu trữ nó để tái sử dụng nó trong cả hai hoạt động khác VÀ khi ứng dụng được bắt đầu trong thời gian tới. Cookie có giá trị trong một năm, vì vậy người dùng ứng dụng của tôi nên đăng nhập một lần và sau đó không bao giờ một lần nữa cho cả năm.

Tôi làm như thế nào? Tôi googled rất nhiều, nhưng hoặc là tôi sử dụng các từ khóa sai hoặc không có giải pháp đơn giản trên internet. Tôi hy vọng ai đó ở đây có thể giúp tôi.

Trân trọng và cảm ơn trước, Jan Oliver

+0

Bạn đang sử dụng AndroidHttpClient? Bạn đã xác nhận rằng không được lưu trữ? Tôi tin rằng việc triển khai thỏa thuận AndroidHttpClient với cửa hàng cookie cho bạn một cách liên tục. – cistearns

+2

Chúng được lưu trữ theo cách mà các yêu cầu sau sử dụng cùng một httpclient nhận ra nó. Nhưng chúng không được bảo tồn sau khi đóng ứng dụng hoặc chuyển đổi hoạt động và tạo các phiên bản mới của httpclient. – janoliver

Trả lời

9

Có vẻ như Android đang sử dụng defaul t trong việc thực hiện bộ nhớ, do đó bạn sẽ cần phải tạo cửa hàng cookie liên tục của riêng bạn.

Hướng dẫn Java này phác thảo việc tạo cửa hàng liên tục của riêng bạn lợi dụng việc triển khai mặc định. http://download.oracle.com/javase/tutorial/networking/cookies/custom.html

Mẫu có hai thứ cần lưu trữ (đọc/ghi) Để lưu trữ, tôi chỉ sử dụng SharedPreferences để lưu trữ cookie phiên mà bạn cần và không tồn tại bất kỳ cookie nào khác.

Mẫu sử dụng móc tắt mà không phải là thứ bạn muốn trong Android. Thay cho run() và hook, tôi sẽ chỉ có một phương thức public mới() để lưu lại những gì bạn muốn, mặc dù điều đó yêu cầu bạn phải lưu giữ() kho lưu trữ bằng tay.

Cho rằng bạn chỉ có một hoặc hai cookie quan trọng bạn có thể lưu chúng trong tiện ích (...)

+0

Cảm ơn câu trả lời tôi đang tìm kiếm. Thật không may tôi đã giải quyết nó lưu trữ các thông tin đăng nhập bây giờ và đăng nhập bất cứ khi nào tôi bắt đầu ứng dụng. HttpClient sau đó được chia sẻ giữa Activites thông qua một lớp tĩnh. Nhưng dù gì cũng cảm ơn! – janoliver

+0

Tại sao móc tắt máy không tốt? – slezica

+0

Sử dụng Runtime addShutdownHook nên tránh trên Android: từ tài liệu Android trên chức năng đó "Lưu ý rằng trên Android, vòng đời ứng dụng không bao gồm kết thúc VM, do đó, gọi phương thức này sẽ không đảm bảo rằng mã của bạn được chạy. sử dụng thông báo vòng đời thích hợp nhất (Activity.onPause, nói). " – cistearns

3

Sau khi bạn thực hiện cuộc gọi http, bạn có thể lấy các tập tin cookie như thế này

List<Cookie> cookies = 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("PHPSESSID")) { 
     PHPSESSID = cookies.get(i).getValue(); 
     } 
    } 
} 

Để gửi chúng trở lại:

nameValuePairs.add(new BasicNameValuePair("PHPSESSID",phpsessid)); 
httppost.setEntity(new UrlEncodedFormEntity(aList)); 

aList là tất cả tên của bạnValuePairs

+0

Bạn đã đọc câu hỏi của tôi chưa? Tôi đã hỏi làm thế nào để lưu trữ các tập tin cookie trong ứng dụng của tôi để sử dụng trong tương lai trong các hoạt động khác và thậm chí cả các ứng dụng khác của ứng dụng của tôi. – janoliver

+0

Đó là những gì phần đầu tiên làm, nó trích xuất các cookie mà bạn đã nhận được từ một trang web. Trong ví dụ này, lấy cookie có tên "PHPSESSID". Sau đó bạn có thể lưu trữ nó trong một String. Phần thứ hai cho thấy cách trả lại cookie cho máy chủ trong các trang vào một ngày sau đó. – Jim

+0

Nếu tôi muốn lưu tất cả Cookie, máy chủ sẽ gửi? không chỉ những người tôi bắt? –

17

Sử dụng một CookieSyncManager để lưu trữ giá trị cookie của bạn. Nó có thể tồn tại trong suốt quá trình khởi động ứng dụng.

Cảnh giác với việc sử dụng CookieSyncManager bên trong số WebViewClient#shouldInterceptRequest trên KitKat. It will deadlock.

EDIT

CookieSyncManager đã bị phản đối trong API 21:

Lớp này được tán thành trong mức API 21. Các WebView tại tự động đồng bộ hóa các tập tin cookie khi cần thiết. Bạn không cần phải tạo hoặc sử dụng CookieSyncManager nữa. Để buộc đồng bộ hóa theo cách thủ công, bạn có thể sử dụng phương thức CookieManager flush() là phương thức thay thế đồng bộ cho sync().

+4

Theo ý kiến ​​của tôi, đây là câu trả lời đúng ... nó đơn giản như 'CookieSyncManager.getInstance(). Sync();' bất cứ khi nào bạn muốn lưu cookie với sự kiên trì (thay vì RAM) –

+0

không được sử dụng để duy trì cửa hàng cookie của trình duyệt? điều này cũng sẽ tồn tại cookie trên HttpClient bên trong một ứng dụng Android? –

+0

Bạn có thể dễ dàng sử dụng CookieSyncManager với HttpClient. Xem http://stackoverflow.com/a/3587332/9636 để biết ví dụ về xử lý cookie HttpClient. –

Các vấn đề liên quan