java - एंड्रॉइड सत्र प्रबंधन




android session (3)

क्या Android सत्र प्रबंधन के लिए कोई विशिष्ट लाइब्रेरी है? मुझे अपने सत्रों को सामान्य एंड्रॉइड ऐप में प्रबंधित करने की ज़रूरत है। WebView में नहीं। मैं अपनी पोस्ट विधि से सत्र सेट कर सकता हूं। लेकिन जब मैं एक और अनुरोध भेजता हूं कि सत्र गुम हो गया है। क्या कोई इस मामले के साथ मेरी मदद कर सकता है?

DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("My url");

HttpResponse response = httpClient.execute(httppost);
List<Cookie> cookies = httpClient.getCookieStore().getCookies();

if (cookies.isEmpty()) {
    System.out.println("None");
} else {
    for (int i = 0; i < cookies.size(); i++) {
        System.out.println("- " + cookies.get(i).toString());
    }
}

जब मैं उसी मेजबान तक पहुंचने का प्रयास करता हूं जो सत्र खो जाता है:

HttpGet httpGet = new HttpGet("my url 2");
HttpResponse response = httpClient.execute(httpGet);

मुझे लॉगिन पेज प्रतिक्रिया शरीर मिलता है।


Android ऐप्स में एक सत्र सक्रिय (उपयोगकर्ता लॉग इन, या जो कुछ भी) रखने के लिए पूरी तरह से पारदर्शी तरीका। यह सिंगलटन और एक HttpRequest / प्रतिक्रिया इंटरसेप्टर के अंदर apache DefaultHttpClient का उपयोग करता है।

सत्रकिपर वर्ग बस जांचता है कि हेडर में से एक सेट-कुकी है, और यदि ऐसा होता है, तो यह बस याद करता है। सत्र एडडर बस अनुरोध के लिए सत्र आईडी जोड़ता है (यदि शून्य नहीं है)। इस तरह, आप पूरी प्रमाणीकरण प्रक्रिया पूरी तरह से पारदर्शी है।

public class HTTPClients {

    private static DefaultHttpClient _defaultClient;
    private static String session_id;
    private static HTTPClients _me;
    private HTTPClients() {

    }
    public static DefaultHttpClient getDefaultHttpClient(){
        if ( _defaultClient == null ) {
            _defaultClient = new DefaultHttpClient();
            _me = new HTTPClients();
            _defaultClient.addResponseInterceptor(_me.new SessionKeeper());
            _defaultClient.addRequestInterceptor(_me.new SessionAdder());
        }
        return _defaultClient;
    }

    private class SessionAdder implements HttpRequestInterceptor {

        @Override
        public void process(HttpRequest request, HttpContext context)
                throws HttpException, IOException {
            if ( session_id != null ) {
                request.setHeader("Cookie", session_id);
            }
        }

    }

    private class SessionKeeper implements HttpResponseInterceptor {

        @Override
        public void process(HttpResponse response, HttpContext context)
                throws HttpException, IOException {
            Header[] headers = response.getHeaders("Set-Cookie");
            if ( headers != null && headers.length == 1 ){
                session_id = headers[0].getValue();
            }
        }

    }
}

आम तौर पर, जावा HttpURLConnection में आप इस तरह से एक कुकी सेट / प्राप्त कर सकते हैं (यहां पूरी कनेक्शन प्रक्रिया है)। नीचे दिया गया कोड मेरे कनेक्टिंग थ्रेड के रन () में है, जिसमें से सभी कनेक्टिंग गतिविधि वर्गों का वारिस होता है। सभी साझा सामान्य स्थिर sCookie स्ट्रिंग जो सभी अनुरोधों के साथ भेजा जाता है। इसलिए आप लॉग इन चालू / बंद होने जैसी सामान्य स्थिति को बनाए रख सकते हैं:

        HttpURLConnection conn = (HttpURLConnection) url.openConnection();             

        //set cookie. sCookie is my static cookie string
        if(sCookie!=null && sCookie.length()>0){
            conn.setRequestProperty("Cookie", sCookie);                  
        }

        // Send data
        OutputStream os = conn.getOutputStream(); 
        os.write(mData.getBytes());
        os.flush();
        os.close(); 

        // Get the response!
        int httpResponseCode = conn.getResponseCode();         
        if (httpResponseCode != HttpURLConnection.HTTP_OK){
           throw new Exception("HTTP response code: "+httpResponseCode); 
        }

        // Get the data and pass them to the XML parser
        InputStream inputStream = conn.getInputStream();                
        Xml.parse(inputStream, Xml.Encoding.UTF_8, mSaxHandler);                
        inputStream.close();

        //Get the cookie
        String cookie = conn.getHeaderField("set-cookie");
        if(cookie!=null && cookie.length()>0){
            sCookie = cookie;              
        }

        /*   many cookies handling:                  
        String responseHeaderName = null;
        for (int i=1; (responseHeaderName = conn.getHeaderFieldKey(i))!=null; i++) {
            if (responseHeaderName.equals("Set-Cookie")) {                  
            String cookie = conn.getHeaderField(i);   
            }
        }*/                

        conn.disconnect();                

मैं पोस्ट के लिए यही उपयोग करता हूं। मैं इस विधि के साथ नए httpClients उपयोग कर सकता हूं जहां phpsessid आपके द्वारा ऊपर दिए गए कोड का उपयोग करके लॉगिन स्क्रिप्ट से निकाली गई PHP सत्र आईडी है।

ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

nameValuePairs.add(new BasicNameValuePair("PHPSESSID",phpsessid));




apache-commons-httpclient