【问题标题】:SignOut Using Retrofit and Shared Preference使用改造和共享偏好注销
【发布时间】:2021-04-14 10:41:50
【问题描述】:

我想在我的 android 应用程序中执行 Signout 功能。首先,我使用改造进行登录,现在,我想使用改造注销。我正在传递 Authrazation 令牌,如果我不使用令牌,那么我会在标题中得到这个错误“getting response http/1.1, code=403, message=Forbidden,url=https:/auth/user/logout”。如何使用 Retrofit 进行注销并且我得到响应 http/1.1, code=403, message=Forbidden,url=https://auth/user/logout,即使在传递令牌后,响应正文为空,它的显示。怎么办?

邮递员头文件

ProfileFregment

              signout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            SessionMaintain.init(getActivity());
            //read string in shared preference.

            String token = SessionMaintain.read(SessionMaintain.TOKEN_USER, null);
            Integer userId = SessionMaintain.read(SessionMaintain.USER_ID, 0);

    
            logout(userId,token);

        }
    });

}

private void logout(Integer userId,String authorization) {
    ApiInterface apiInterface = ApiClient.getClient().create(ApiInterface.class);
    Call<LogResponse> logoutCall = apiInterface.signOut(userId,authorization);
    logoutCall.enqueue(new Callback<LogResponse>() {
       
       @Override
        public void onResponse(Call<LogResponse> call, Response<LogResponse> response) {

          Log.d("LogResponse",response.toString());
            if(response.isSuccessful()){

                LogResponse lresponse = response.body();
                lresponse.getMessage();



                Log.d("Token","Response"+response.body().getMessage());
                Intent i = new Intent(getActivity(), LoginActivity.class);
                startActivity(i);
                SessionMaintain.clear();


            }
        }

      

共享偏好

public static String read(String key, String defValue) {
    return mSharedPref.getString(key, defValue);
}

public static void write(String key, String value) {
    SharedPreferences.Editor prefsEditor = mSharedPref.edit();
    prefsEditor.putString(key, value);
    prefsEditor.commit();
}

public static boolean read(String key, boolean defValue) {
    return mSharedPref.getBoolean(key, defValue);
}

public static void write(String key, boolean value) {
    SharedPreferences.Editor prefsEditor = mSharedPref.edit();
    prefsEditor.putBoolean(key, value);
    prefsEditor.commit();
}

型号

 @SerializedName("message")

public String message;

ApiInteraction

                     @FormUrlEncoded
                   @POST("auth/user/logout")
     Call<LogResponse> signOut(@Field("user_Id") Integer user_id,
                          @Header("Authorization") String authorization);
             

【问题讨论】:

  • 您能详细说明一下吗?你到底有什么问题?

标签: android retrofit2


【解决方案1】:

假设当您从 logout http 调用中获得成功响应时,您需要清除用户会话数据。

将以下函数添加到您的 SessionMaintain 类中:

public static void clear() {
    SharedPreferences.Editor prefsEditor = mSharedPref.edit();
    prefsEditor.clear();
    prefsEditor.commit();
}

并在您从注销服务获得成功响应时使用它,如下所示:

@Override
public void onResponse(Call<LogResponse> call, Response<LogResponse> response)
{
    Log.d("LogResponse", response.toString());
    if (response.isSuccessful()) {
        // here
        SessionMaintain.clear()
    }
}

【讨论】:

  • @mhwajeeh- 我还有一个问题,响应我得到 http/1.1,code=403,message=Forbidden,url=xxxxx.com/auth/user/logout},我正在使用 Token,但仍然收到此错误。
  • 你能帮我解决这个问题吗
  • 您确定发送带有正确标头形式的令牌吗?对于令牌身份验证,我相信您应该以这种形式添加标头:Authorization: Bearer &lt;token&gt;
  • 所以尝试更改您的调用以将'Bearer ' 字符串添加到令牌中,就像这样,apiInterface.signOut(userId,"Bearer " + authorization);
  • 在头文件中,我像这样传递(授权:令牌 )否则响应不来。
猜你喜欢
  • 2014-07-29
  • 2021-03-23
  • 2020-09-22
  • 1970-01-01
  • 2019-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多