我有一个RestAPI,当点击验证用户时。 这个api暴露给android和ios开发人员他们点击这个api以允许用户登录我们的应用程序
我的要求是这个.1)如果用户有手机说带有IMEI“abc1234”的abc电话。他从这部手机登录。现在,如果他试图从他的第二部手机登录,那么他不应该被允许从第二部手机登录。他应该先从abc设备注销。
现在几乎没有并发症 1)如果用户从abc登录。退出注销后,他会格式化手机或卸载应用程序。那我该如何处理来自同一设备或其他设备的登录。
基本上我想了解这类情景的策略或良好做法。
答案 0 :(得分:14)
良好的做法是让用户从第二台设备登录并从第一台设备注销,从用户体验中获得更好,并且易于操作,例如
我从DeviceId A
登录(在db中针对用户更新DeviceId)
然后我尝试从DeviceId B
登录(再次更新DeviceId覆盖db中对用户的先前DeviceId)
现在如果我从DeviceId A
发出请求,请匹配DB中的DeviceID,它将返回false。将用户发回登录页面。
答案 1 :(得分:2)
我建议您维护一个登录会话。只要成功登录,您就会向用户提供唯一的会话标识符。此会话ID随后可用于来自用户的进一步请求/呼叫。
对于用户从其他号码登录的情况,活动会话将此第二登录请求标记为无效。
保持每个会话的老化机制。这样,由电话断开或关闭引起的非活动会话将被终止。
答案 2 :(得分:1)
您必须在Android和网站中使用您的登录Web服务或API传递此用户状态,您可以直接从数据库中检查。
答案 3 :(得分:1)
使用SharedPreferences作为解决方案,
例如。
public class Pref_Storage {
private static SharedPreferences sharedPreferences = null;
public static void openPref(Context context) {
sharedPreferences = context.getSharedPreferences(context.getResources().getString(R.string.app_name),
Context.MODE_PRIVATE);
}
public static void deleteKey(Context context, String key) {
HashMap<String, String> result = new HashMap<String, String>();
Pref_Storage.openPref(context);
for (Entry<String, ?> entry : Pref_Storage.sharedPreferences.getAll()
.entrySet()) {
result.put(entry.getKey(), (String) entry.getValue());
}
boolean b = result.containsKey(key);
if (b) {
Pref_Storage.openPref(context);
Editor prefsPrivateEditor = Pref_Storage.sharedPreferences.edit();
prefsPrivateEditor.remove(key);
prefsPrivateEditor.commit();
prefsPrivateEditor = null;
Pref_Storage.sharedPreferences = null;
}
}
public static void setDetail(Context context, String key, String value) {
Pref_Storage.openPref(context);
Editor prefsPrivateEditor = Pref_Storage.sharedPreferences.edit();
prefsPrivateEditor.putString(key, value);
prefsPrivateEditor.commit();
prefsPrivateEditor = null;
Pref_Storage.sharedPreferences = null;
}
public static Boolean checkDetail(Context context, String key) {
HashMap<String, String> result = new HashMap<String, String>();
Pref_Storage.openPref(context);
for (Entry<String, ?> entry : Pref_Storage.sharedPreferences.getAll()
.entrySet()) {
result.put(entry.getKey(), (String) entry.getValue());
}
boolean b = result.containsKey(key);
return b;
}
public static String getDetail(Context context, String key) {
HashMap<String, String> result = new HashMap<String, String>();
Pref_Storage.openPref(context);
for (Entry<String, ?> entry : Pref_Storage.sharedPreferences.getAll()
.entrySet()) {
result.put(entry.getKey(), (String) entry.getValue());
}
String b = result.get(key);
return b;
}
}
使用:
登录前请检查login_flag:
if (Pref_Storage.checkDetail(getApplicationContext(), "login_flag"))
{
// Home Screen
}
else
{
//Display Login Screen
}
登录后设置login_flag:
Pref_Storage.setDetail(getApplicationContext(), "login_flag", "0");
答案 4 :(得分:0)
尝试保存布尔变量。将标记为0并允许用户登录。 登录时,该值将更改为1,注销时将其更改回0。 只有当布尔字符的值为0时才允许用户登录。
答案 5 :(得分:0)
您可以使用SharedPreference在记录后存储用户登录详细信息,并在第二次运行应用程序时检查登录详细信息是否可用。注销后,您必须删除共享首选项。
有关详细信息,请访问以下链接:
http://www.tutorialspoint.com/android/android_shared_preferences.htm http://developer.android.com/reference/android/content/SharedPreferences.html
答案 6 :(得分:0)
php示例
用户成功登录时
var client = new RestClient(config.BaseUrl)
{
Timeout = 4500,
ReadWriteTimeout = 4500
};
var req = new RestRequest("personInformation");
req.AddQueryParameter("SSN", sweSsn);
if (!string.IsNullOrWhiteSpace(postalCode))
req.AddQueryParameter("ZipCode", postalCode);
req.AddHeader("Package", "personadress");
req.AddHeader("Authorization", config.BasicAuthorization);
var resp = client.Get(req);
每当浏览器访问服务器总是比较$ t2> $ t1,如果没有发送浏览器消息“您正在注销”