【发布时间】:2017-09-12 06:16:29
【问题描述】:
我是 android 世界的新手,我有一个关于保存设置的问题。我将尝试用一个例子来解释它。假设我们有一个类似于 gmail 的 android 应用程序,其中用户将帐户与应用程序同步。登录名/密码存储在哪里,即使关闭手机电源,它们仍然存在?它们是否存储在 SharedPreferences 中,在单独的文件中,在数据库中?任何解释将不胜感激。
【问题讨论】:
我是 android 世界的新手,我有一个关于保存设置的问题。我将尝试用一个例子来解释它。假设我们有一个类似于 gmail 的 android 应用程序,其中用户将帐户与应用程序同步。登录名/密码存储在哪里,即使关闭手机电源,它们仍然存在?它们是否存储在 SharedPreferences 中,在单独的文件中,在数据库中?任何解释将不胜感激。
【问题讨论】:
Google 和其他此类公司使用会话来识别用户。他们不会在您的手机中存储密码。在您第一次登录后,服务器将向用户发出一个唯一的会话 ID,应用程序可能会将其存储在 SharedPreferences 中,之后,每个连续的服务器请求也必须发送此会话 ID 以进行身份验证。在您的情况下,您可以很好地将任何设置存储在 SharedPreferences 中,但不建议存储密码。如果你有大量的数据需要存储,例如你正在创建一个具有各种功能的游戏,你可以使用 SQLite 数据库来存储和检索数据。
编辑: 首先,使用 HttpUrlConnection 将用户名和密码发送到您的服务器。在此之后,我们需要从服务器响应标头中提取 cookie。 以下代码演示了如何从服务器响应中获取 cookie:
String[] tokens;
List cookies = conn.getHeaderFields().get("Set-Cookie");
if (cookies != null) {
for (int i = 0; i < cookies.size(); i++) {
String cookieString = (String) cookies.get(i);
tokens = cookieString.split(";");
List<String> cookieHeaders = new ArrayList<>();
for (String str : tokens) {
if (str.contains("httponly")||str.contains("HttpOnly")) {
str = str.trim();
cookieHeaders.add(str);
} else {
Log.d("loginactivity","str "+str);
str = str.substring(0, str.indexOf("=")).trim();
cookieHeaders.add(str);
}
}
String token = cookieString;
}
}
您可以将令牌放入共享首选项中:
sharedPreferences.edit().putString("token", token).apply();
在此之后,将 cookie 添加到对服务器的任何连续请求。
String cookie = sharedPreferences.getString("token","");
httpConn.setRequestProperty("Cookie",cookie);
【讨论】:
您可以将数据保存在 SQLite 数据库中。您的应用需要访问文件系统权限。
【讨论】: