2011-03-08 8 views
6

में कुकीज को कैसे बनाए रखें, हमारे पास एक .net फॉर्म एथ सक्षम साइट है जो उपयोगकर्ता हमारे एंड्रॉइड ऐप में वेबव्यू क्लाइंट के माध्यम से विज़िट करता है। साइट की विशेषताओं में से एक है कुछ पीडीएफ फाइलों को लॉगिन और डाउनलोड करने की क्षमता, हालांकि आपको पीडीएफ डाउनलोड करने के लिए लॉग इन करने की आवश्यकता है।वेबव्यू क्लाइंट से URL को कनेक्शन, ब्राउज़र, या अन्य फ़ाइल डाउनलोड तकनीक में एंड्रॉइड

हम वर्तमान में shouldOverrideUrlLoading लागू कर रहे हैं और सही स्थिति को पूरा करते समय निम्न कोड के माध्यम से पीडीएफ डाउनलोड कर रहे हैं।

URL u = new URL(url); 
URLConnection conn = u.openConnection(); 
int contentLength = conn.getContentLength(); 

DataInputStream stream = new DataInputStream(u.openStream()); 

byte[] buffer = new byte[contentLength]; 
stream.readFully(buffer); 
stream.close(); 

DataOutputStream fos = new DataOutputStream(new FileOutputStream("/sdcard/download/file.pdf")); 
fos.write(buffer); 
fos.flush(); 
fos.close(); 

आईआईएस लॉग से, यह स्पष्ट है कि आईआईएस इस अनुरोध को लॉग इन करने और इसे लॉगिन पृष्ठ पर रीडायरेक्ट करने पर विचार नहीं करता है।

हमें फ़ाइल डाउनलोड अनुरोध में जारी ऑथ कुकी के साथ फ़ाइल डाउनलोड करने का एक तरीका है, लेकिन कुकी पर बने रहने के तरीके के रूप में हमें नुकसान हुआ है।

हमारे लिए एक और व्यवहार्य समाधान WebViewClient और एंड्रॉइड ब्राउज़र के बीच ऑथ कुकी को जारी रखना है। अगर हम ऐसा कर सकते हैं, तो हम ब्राउज़र में डिफ़ॉल्ट कार्रवाई के माध्यम से पीडीएफ फ़ाइल खोलेंगे।

संपादित करें: ऐसा लगता है कि मैं के माध्यम से

conn.setRequestProperty("Cookie", ""); 

अब मैं सिर्फ यह पता लगाने कैसे WebViewClient से बाहर प्रमाणन कुकी पढ़ने के लिए

उत्तर

8

जब से तुम ASP.NET Forms authentication उपयोग कर रहे हैं, तो आप URLConnection को WebView से forms auth cookie को कॉपी करना होगा। सौभाग्य से यह बहुत सीधे आगे है। इस कोड की shouldOverrideUrlLoading

string url = "http://site/generatePdfBehindFormsAuth"; 

// get an instance of a cookie manager since it has access to our auth cookie 
CookieManager cookieManager = CookieManager.getInstance(); 

// get the cookie string for the site. This looks something like ".ASPXAUTH=data" 
String auth = cookieManager.getCookie(url).toString(); 

URLConnection conn = (URLConnection)new URL(url).openConnection(); 

// Set the cookie string to be sent for download. In our case we're just copying the 
// entire cookie string from the previous connection, so all values stored in 
// cookies are persisted to this new connection. This includes the aspx auth 
// cookie, otherwise it would not be authenticated 
// when downloading the file. 
conn.setRequestProperty("Cookie", auth); 
conn.setDoOutput(true); 
conn.connect(); 

// get the filename from the servers response, its typical value is something like: 
// attachment; filename="GeneratedPDFFilename.pdf" 
String filename = conn.getHeaderField("Content-Disposition").split("\"")[1]; 

// by default, we'll store the pdf in the external storage directory 
String fileRoot = "/sdcard/"; 

// Complete the download 
FileOutputStream f = new FileOutputStream(new File(fileRoot, filename)); 
InputStream in = conn.getInputStream(); 
byte[] buffer = new byte[1024]; 
int len1 = 0; 
while ((len1 = in.read(buffer)) > 0) 
{ 
    f.write(buffer,0, len1); 
} 
f.close(); 
in.close(); 

नोट एक कार्यान्वयन में रहती है: एक बात है कि आप नहीं अपने URLConnection पर getContentLength को एक फोन करना चाहिए के बारे में पता किया जाना है। डिबगिंग के 4 घंटों के बाद, वायरसहार्क ने आखिरकार दिखाया कि, यदि आप getContentLength पर कॉल करते हैं, तो कुकी को उस सामग्री के लिए भेजा जाएगा जो सामग्री की लंबाई प्राप्त करता है, लेकिन कुकी को बाद के अनुरोधों के लिए भेजा नहीं जाएगा, यहां तक ​​कि URLConnection के उसी उदाहरण पर भी । हो सकता है कि मैं निष्पक्ष हूं और यह डिज़ाइन द्वारा है (दस्तावेज़ीकरण यह इंगित नहीं करता है कि यह डिज़ाइन द्वारा है), लेकिन getContentLength पर कॉल करने के बाद setRequestProperty पर कॉल करके मैं बाद में फ़ाइल अनुरोध के लिए कुकी सेट करने में असमर्थ था। अगर मैंने ऐसा करने का प्रयास किया, तो मुझे एक बल मिल जाएगा।

+0

बहुत उपयोगी कोड, लेकिन यह कोड कुकीज़ को कहां सेट कर रहा है? URLConnect का उपयोग कर urls पर ब्राउज़ करते समय कुकीज़ सेट करना संभव है? – NoBugs

+0

इस लाइन पर कुकी को इसकी सेटिंग 'कॉन।setRequestProperty ("कुकी", auth); ', मैं स्पष्ट रूप से स्पष्ट करने के लिए पोस्ट संपादित करूंगा। कुकी स्ट्रिंग पर आपके पास 100% नियंत्रण है, दोनों इसे 'वेब व्यू' से प्राप्त कर रहे हैं और इसे 'URLConnection' में सेट कर रहे हैं, ताकि आप जो भी वैल्यू चाहते हैं उसे जारी रख सकें। मैं 'वेबव्यू' द्वारा भेजे गए कुकी स्ट्रिंग का निरीक्षण करने के लिए फिडलर या कुछ का उपयोग करके पुनः प्राप्त करता हूं, इस तरह आप जानते हैं कि 'URLConnection' में क्या रहना है। उपर्युक्त मामले में, मैंने बस सभी कुकीज़ को जारी रखा। मैं चुनिंदा कुछ दूसरों को नहीं चुन सकता था, लेकिन मैंने आसान विकल्प चुना। –

1

आप पर ध्यान दिया है की जरूरत है मैन्युअल रूप से प्रमाणन कुकी सेट कर सकते हैं CookieSyncManager कक्षा? मेरा मानना ​​है कि सर्वर से प्राप्त कुकीज़ को जारी रखने के लिए यह आवश्यक है और उनका पुन: उपयोग करें।

http://developer.android.com/reference/android/webkit/CookieSyncManager.html

+0

हाँ मैंने इसे देखा है, लेकिन मैं यह समझने में सक्षम नहीं हूं कि मुझे ऐसा करने के लिए इसका उपयोग कैसे किया जाए। हालांकि मैं इसे और अधिक देख लूंगा! धन्यवाद! –

+0

यह रैम से स्टोरेज में कुकीज़ को स्थानांतरित करने के लिए एक वर्ग प्रतीत होता है, कोड पर वेबकिट नहीं, जब तक कि मैं गलत नहीं हूं? – NoBugs

+0

@ user778234 आप सही हैं, कक्षा में प्रलेखन देखें: CookieSyncManager का उपयोग ब्राउज़र कुकी स्टोर को रैम और स्थायी स्टोरेज के बीच सिंक्रनाइज़ करने के लिए किया जाता है। सर्वश्रेष्ठ प्रदर्शन प्राप्त करने के लिए, ब्राउज़र कुकीज़ को रैम में सहेजा जाता है। एक अलग धागा एक टाइमर द्वारा संचालित कुकीज़ के बीच बचाता है। –

संबंधित मुद्दे