【问题标题】:Android - Volley library: Session expired issue in SSL production environmentAndroid - Volley 库:SSL 生产环境中的会话过期问题
【发布时间】:2018-12-01 15:19:40
【问题描述】:

我有 2 个页面:第一个是登录页面,第二个是类别页面。在输入凭据后的登录 API 中,我从响应标头获取响应作为会话 ID。 会话 ID 将被保存,并将用于进一步的 API 调用。我正在尝试调用第二个 API(类别页面)。在此页面中,作为输入传递请求标头中保存的会话 ID。收到“会话已过期”的响应。还尝试在请求标头中传递Set-Cookie: PHPSESSID=d9f9sdkfjs9。但它没有用。

注意:

  1. 我仅在生产环境中遇到此问题(包括 SSL)
  2. 我正在使用 volley 库来处理 API。


public void fnCallLoginAPI() {
    try {
        //DEMO URL
        //final String URL="http://demo.io/api/api.php?m=login";
        //LIVE URL
        final String URL = "https://www.live.com/shop/api/api.php?m=login";
        final String requestBody = "email=abc.b@xyz.com" + "&password=43443==" + "&strPlatform=i" + "&strDeviceToken=null";
              StringRequest stringRequest = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                String strResponse = response;
                System.out.println("THE RESPONSE IS in PROFILE IS" + response);
                  }
        },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {

                    }
                })
        {
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                Map<String, String> headers = new HashMap<>();
                headers.put("Cookie", "PHPSESSID=" + sessionID);
                return headers;
            }
 @Override
            public byte[] getBody() throws AuthFailureError {
                byte[] body = new byte[0];
                try {
                    System.out.println("THE REQIEST BODY IS" + requestBody);
                    body = requestBody.getBytes("UTF-8");
                } catch (UnsupportedEncodingException e) {
                    Log.e("TAG", "Unable to gets bytes from JSON", e.fillInStackTrace());
                }
                return body;
            }
        };

        AppApplication.getInstance().addToRequestQueue(stringRequest, "assignment");
    } catch (Exception e) {

    }
}


public void fnCallCateGoryAPI(){
try { final String URL ="https://www.live.com/shop/api/api.php?m=getcategories"; 
    StringRequest stringRequest = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            String strResponse = response;
            System.out.println("THE RESPONSE IS in PROFILE IS" + response);
            JSONObject jsonObj = null;
            try {
                jsonObj = new JSONObject(strResponse);
                sessionID = jsonObj.optString("session_id");
                System.out.print("sessionID" + sessionID);
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                }
            })
    {
      };

    AppApplication.getInstance().addToRequestQueue(stringRequest, "assignment");
} catch (Exception e) {}
}}

【问题讨论】:

    标签: android ssl android-volley session-cookies request-headers


    【解决方案1】:

    @fazil 从后端增加令牌过期时间后尝试

    【讨论】:

      【解决方案2】:

      @fazil:我的项目中也遇到过类似的情况,我理解的原因实际上是由于在同一键“Set-Cookie”下设置了多个标头值。

      请在您的日志中检查这一点。

      另外,请确保您已在请求中正确设置标头(检查来自服务器的请求和响应日志)。

      如果实现的一切都是正确的并且问题是由于同一个标头中有多个值,您需要检查 volley 的实现:https://github.com/georgiecasey/android-volley-duplicateheadersfix

      【讨论】:

        猜你喜欢
        • 2020-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多