How to put Cookie session id into volley request?

前端 未结 3 524
谎友^
谎友^ 2021-01-17 09:07

So, i have this code to make a POST request with volley:

public class MainActivity extends AppCompatActivity {

 Button btnSearch;
 ProgressDialog loadingDia         


        
相关标签:
3条回答
  • 2021-01-17 09:26

    You getting cookie (Session id) in Login response, Save cookie in sharedpreference or other db, and use that to send in request.

    for getting cookie from login request

     CustomStringRequest stringRequest = new CustomStringRequest(Request.Method.POST, SIGN_IN_URL,
                        new Response.Listener<CustomStringRequest.ResponseM>() {
                            @Override
                            public void onResponse(CustomStringRequest.ResponseM result) {
    
                                CookieManager cookieManage = new CookieManager();
                                CookieHandler.setDefault(cookieManage);
    
                                progressDialog.hide();
                                try {
                                    //From here you will get headers
                                    String sessionId = result.headers.get("Set-Cookie");
                                    String responseString = result.response;
    
                                    Log.e("session", sessionId);
                                    Log.e("responseString", responseString);
    
                                    JSONObject object = new JSONObject(responseString);
    

    CustomStringRequest class

    public class CustomStringRequest extends Request<CustomStringRequest.ResponseM> {
    
    
        private Response.Listener<CustomStringRequest.ResponseM> mListener;
    
        public CustomStringRequest(int method, String url, Response.Listener<CustomStringRequest.ResponseM> responseListener, Response.ErrorListener listener) {
            super(method, url, listener);
            this.mListener = responseListener;
        }
    
    
        @Override
        protected void deliverResponse(ResponseM response) {
            this.mListener.onResponse(response);
        }
    
        @Override
        protected Response<ResponseM> parseNetworkResponse(NetworkResponse response) {
            String parsed;
            try {
                parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
            } catch (UnsupportedEncodingException e) {
                parsed = new String(response.data);
            }
    
            ResponseM responseM = new ResponseM();
            responseM.headers = response.headers;
            responseM.response = parsed;
    
            return Response.success(responseM, HttpHeaderParser.parseCacheHeaders(response));
        }
    
    
        public static class ResponseM {
            public Map<String, String> headers;
            public String response;
        }
    
    }
    

    set cookie when add request to server..

                    @Override
                    public Map<String, String> getHeaders() throws AuthFailureError {
                        Map<String, String> headers = new HashMap<String, String>();
    
                        String session=sharedPreferences.getString("sessionId","");
                        headers.put("Cookie",session);
                        return headers;
                    }
    
    0 讨论(0)
  • 2021-01-17 09:28

    Using cookies with Android volley library

    Request class:

    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;
        }
    }
    

    MyApp:

    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());
            }
        }
    
    }
    
    0 讨论(0)
  • 2021-01-17 09:38

    So the problem was getting a valid cookie. My mistake was to get it from the POST request itself. I kept the same working principle, getting the cookie when I started the application but using GET instead of POST and calling the root of the URL instead of the address where I get the JSON.

    My solution looked like this:

    public void requestCookie() {
      queue = Volley.newRequestQueue(this);
      String url = "http://myurl.com/";
    
      StringRequest getRequest = new StringRequest(Request.Method.GET, url,
       new Response.Listener <String> () {
        @Override
        public void onResponse(String response) {
         String x = myCookieManager.getCookieValue();
        }
       },
       new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
         Log.d("ERROR", "Error => " + error.toString());
         hideLoading();
        }
       }
      ) {   
       protected Response <String> parseNetworkResponse(NetworkResponse response) {
        try {
         String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
         String header_response = String.valueOf(response.headers.values());
         int index1 = header_response.indexOf("PHPSESSID=");
         int index2 = header_response.indexOf("; path");
         //Log.e(Utils.tag, "error is : " + index1 + "::" + index2);
         session_id = header_response.substring(index1, index2);
    
         return Response.success(jsonString, HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
         return Response.error(new ParseError(e));
        }
       }
      };
    
      queue.add(getRequest);
     }
    
    0 讨论(0)
提交回复
热议问题