2017-03-27 13 views
12

मेरे पास एक Django स्क्रिप्ट सर्वर पर चल रही है जो सर्वर को भेजे गए प्रत्येक अनुरोध के लिए सत्र चर बनाता है। स्क्रिप्ट पिछले संग्रहित सत्र चर के आधार पर एक विशिष्ट मान देता है।वॉली अनुरोध Django सत्रों के साथ काम नहीं कर रहे हैं

जब मैंने ब्राउज़र पर स्क्रिप्ट का परीक्षण किया, तो Django पर सत्र आवश्यकता के अनुसार काम किया।

हालांकि, वही अनुरोध भेजने के लिए वॉली का उपयोग करते समय, स्क्रिप्ट पिछले सत्र चर के विचार के बिना प्रत्येक अनुरोध को नए अनुरोध के रूप में मानती है।

StringRequest stringRequest = new StringRequest(Request.Method.GET,Send_URL, 
      new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response) { 
        Response(response); 
       } 
      }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
     } 
    }); 
    requestQueue.add(stringRequest); 
} 

RequestQueue defined globally and context assigned in the onCreate() method

पी.एस मैं ब्राउज़र से अनुरोध करके फिर से जांचा और यह काम करता है। तो Django अंत में कोई समस्या नहीं है।
धन्यवाद!

+2

क्या आपने [कुकीज़ का उपयोग करने के लिए वॉली को कॉन्फ़िगर करने का प्रयास किया] [http://stackoverflow.com/a/21271347/2646526)? – heenenee

+0

क्या आप पिछली बार में चीज की तरह corsfilter किया था ?? मुझे वही समस्या है जब वसंत ढांचे का उपयोग करके बैक एंड विकसित किया जाता है। –

उत्तर

4

वॉली डिफ़ॉल्ट रूप से कुकी का समर्थन नहीं करता है। आप StringRequest वर्ग नीचे के रूप में दिखाया ओवरराइड करना चाहिए:

public class StringRequest extends com.android.volley.toolbox.StringRequest { 

private final Map<String, String> _params; 

/** 
* @param method 
* @param url 
* @param params 
*   A {@link HashMap} to post with the request. Null is allowed 
*   and indicates no parameters will be posted along with request. 
* @param listener 
* @param errorListener 
*/ 
public StringRequest(int method, String url, Map<String, String> params, Listener<String> listener, 
     ErrorListener errorListener) { 
    super(method, url, listener, errorListener); 

    _params = params; 
} 

@Override 
protected Map<String, String> getParams() { 
    return _params; 
} 

/* (non-Javadoc) 
* @see com.android.volley.toolbox.StringRequest#parseNetworkResponse(com.android.volley.NetworkResponse) 
*/ 
@Override 
protected Response<String> parseNetworkResponse(NetworkResponse response) { 
    // since we don't know which of the two underlying network vehicles 
    // will Volley use, we have to handle and store session cookies manually 
    MyApp.get().checkSessionCookie(response.headers); 

    return super.parseNetworkResponse(response); 
} 

/* (non-Javadoc) 
* @see com.android.volley.Request#getHeaders() 
*/ 
@Override 
public Map<String, String> getHeaders() throws AuthFailureError { 
    Map<String, String> headers = super.getHeaders(); 

    if (headers == null 
      || headers.equals(Collections.emptyMap())) { 
     headers = new HashMap<String, String>(); 
    } 

    MyApp.get().addSessionCookie(headers); 

    return headers; 
} 
} 

और आपके आवेदन वर्ग:

public class MyApp extends Application { 
    private static final String SET_COOKIE_KEY = "Set-Cookie"; 
    private static final String COOKIE_KEY = "Cookie"; 
    private static final String SESSION_COOKIE = "sessionid"; 

    private static MyApp _instance; 
    private RequestQueue _requestQueue; 
    private SharedPreferences _preferences; 

    public static MyApp get() { 
     return _instance; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     _instance = this; 
      _preferences = PreferenceManager.getDefaultSharedPreferences(this); 
     _requestQueue = Volley.newRequestQueue(this); 
    } 

    public RequestQueue getRequestQueue() { 
     return _requestQueue; 
    } 


    /** 
    * Checks the response headers for session cookie and saves it 
    * if it finds it. 
    * @param headers Response Headers. 
    */ 
    public final void checkSessionCookie(Map<String, String> headers) { 
     if (headers.containsKey(SET_COOKIE_KEY) 
       && headers.get(SET_COOKIE_KEY).startsWith(SESSION_COOKIE)) { 
       String cookie = headers.get(SET_COOKIE_KEY); 
       if (cookie.length() > 0) { 
        String[] splitCookie = cookie.split(";"); 
        String[] splitSessionId = splitCookie[0].split("="); 
        cookie = splitSessionId[1]; 
        Editor prefEditor = _preferences.edit(); 
        prefEditor.putString(SESSION_COOKIE, cookie); 
        prefEditor.commit(); 
       } 
      } 
    } 

    /** 
    * Adds session cookie to headers if exists. 
    * @param headers 
    */ 
    public final void addSessionCookie(Map<String, String> headers) { 
     String sessionId = _preferences.getString(SESSION_COOKIE, ""); 
     if (sessionId.length() > 0) { 
      StringBuilder builder = new StringBuilder(); 
      builder.append(SESSION_COOKIE); 
      builder.append("="); 
      builder.append(sessionId); 
      if (headers.containsKey(COOKIE_KEY)) { 
       builder.append("; "); 
       builder.append(headers.get(COOKIE_KEY)); 
      } 
      headers.put(COOKIE_KEY, builder.toString()); 
     } 
    } 

} 

भी आप देख सकते हैं और अधिक के लिए this link ...

3

मैं वॉली लाइब्रेरी का उपयोग कर एक ही समस्या थी अन्य स्क्रिप्टिंग भाषा में, आपको वॉली लाइब्रेरी here के बारे में जाना होगा ..

इसके अतिरिक्त वॉयस lley, डिफ़ॉल्ट रूप से कैश मान संग्रहीत तो अपने कोड दूसरी बार काम नहीं किया (मतलब यह है कि एक ही मान वापसी) ताकि आप सर्वर कार्यों के इस प्रकार का उपयोग करने के HttpURLConnection डिफ़ॉल्ट विधि की कोशिश कर सकते

धन्यवाद आशा है कि इसकी मदद !!!

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