Android保存用户会话

时间:2014-05-18 09:08:35

标签: android session zend-framework login zend-auth

我是android的新手我试图保存登录会话并在每次向服务器发送请求时发送它,我的Web服务是PHP(Zend框架2)。

此代码用于识别用户:

$auth = Zend_Auth::getInstance();
$IdentityObj = $auth->getIdentity();

可以保存会话并像我使用网络浏览器一样发送,而不会对我的网络服务进行任何更改。

2 个答案:

答案 0 :(得分:3)

是的,确实如此。您只需使用SharedPreferences存储会话。

这个想法是,在您登录后,我猜您会返回某种会话ID或其他内容。你只需要存储它。然后,在子句执行中,您只需在执行任何请求之前获取该会话。

SharedPreferences preferences = 
    getSharedPreferences("com.blabla.yourapp", Context.MODE_PRIVATE);

//Save it
preferences.edit().putString("session", <yoursessiontoken>).commit();

//Fetch it
// The second parameter is the default value.
preferences.getString("session", ""); 

无论如何,你最好阅读文档以真正理解你在做什么。

答案 1 :(得分:3)

使用SharedPreferences是一种在Android中保存和检索关键值对数据的方法,也是在整个应用程序中保持会话的方法。

要与SharedPreferences合作,请执行以下步骤:

  1. 通过将两个参数传递给构造函数(String和integer)来初始化共享SharedPreferences接口

    // Sharedpref file name
    private static final String PREF_NAME = "PreName";
    // Shared pref mode
    int PRIVATE_MODE = 0;
    //Initialising the SharedPreferences
    SharedPreferences pref = getApplicationContext()
            .getSharedPreferences("MyPref", 0); // 0 - for private mode
    
  2. 使用编辑器界面及其方法修改SharedPreferences值并存储数据以供将来检索

    //Initialising the Editor
    Editor editor = pref.edit();
    editor.putBoolean("key_name", true); // Storing boolean - true/false
    editor.putString("key_name", "string value"); // Storing string
    editor.putInt("key_name", "int value"); // Storing integer
    editor.putFloat("key_name", "float value"); // Storing float
    editor.putLong("key_name", "long value"); // Storing long     
    editor.commit(); // commit changes
    
  3. 检索数据:

    可以通过调用getString()(For string)方法从保存的首选项中检索数据。请记住,应在共享首选项上调用此方法,而不是在编辑器上

    // returns stored preference value
    // If value is not present return second param value - In this case null
    pref.getString("key_name", null); // getting String
    pref.getInt("key_name", null); // getting Integer
    pref.getFloat("key_name", null); // getting Float
    pref.getLong("key_name", null); // getting Long
    pref.getBoolean("key_name", null); // getting boolean
    
  4. 最后,清除/删除数据,例如退出

    如果要从共享首选项中删除,可以调用remove(“key_name”)删除该特定值。如果要删除所有数据,请致电clear()

    editor.remove("name"); // will delete key name
    editor.remove("email"); // will delete key email
    
    editor.commit(); // commit changes
    
    //Following will clear all the data from shared preferences
    editor.clear();
    editor.commit(); // commit changes
    
  5. 如果您愿意,请点击此链接下载一个简单明了的示例: http://www.androidhive.info/2012/08/android-session-management-using-shared-preferences/

    此外,这是我使用的实现类:

    import java.util.HashMap;
    import android.annotation.SuppressLint;
    import android.content.Context;
    import android.content.Intent;
    import android.content.SharedPreferences;
    import android.content.SharedPreferences.Editor;
    
    public class SessionManager {
        // Shared Preferences
        SharedPreferences pref;
        // Editor for Shared preferences
        Editor editor;
        // Context
        Context _context;
        // Shared pref mode
        int PRIVATE_MODE = 0;
        // Sharedpref file name
        private static final String PREF_NAME = "AndroidHivePref";
        // All Shared Preferences Keys
        private static final String IS_LOGIN = "IsLoggedIn";
        // User name (make variable public to access from outside)
        public static final String KEY_NAME = "name";
        // Email address (make variable public to access from outside)
        public static final String KEY_EMAIL = "email";
    
        // Constructor
        @SuppressLint("CommitPrefEdits")
        public SessionManager(Context context) {
            this._context = context;
            pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
            editor = pref.edit();
        }
    
        /**
         * Create login session
         */
        public void createLoginSession(String name, String email) {
            // Storing login value as TRUE
            editor.putBoolean(IS_LOGIN, true);
            // Storing name in pref
            editor.putString(KEY_NAME, name);
            // Storing email in pref
            editor.putString(KEY_EMAIL, email);
            // commit changes
            editor.commit();
        }
    
        /**
         * Check login method wil check user login status If false it will redirect
         * user to login page Else won't do anything
         */
        public void checkLogin() {
            // Check login status
            if (!this.isLoggedIn()) {
                // user is not logged in redirect him to Login Activity
                Intent i = new Intent(_context, MainActivity.class);
                // Closing all the Activities
                i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    
                // Add new Flag to start new Activity
                i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    
                // Staring Login Activity
                _context.startActivity(i);
            }
    
        }
    
        /**
         * Get stored session data
         */
        public HashMap<String, String> getUserDetails() {
            HashMap<String, String> user = new HashMap<String, String>();
            // user name
            user.put(KEY_NAME, pref.getString(KEY_NAME, null));
    
            // user email id
            user.put(KEY_EMAIL, pref.getString(KEY_EMAIL, null));
    
            // return user
            return user;
        }
    
        /**
         * Clear session details
         */
        public void logoutUser() {
            // Clearing all data from Shared Preferences
            editor.clear();
            editor.commit();
    
            // After logout redirect user to Loing Activity
            Intent i = new Intent(_context, MainActivity.class);
            // Closing all the Activities
            i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    
            // Add new Flag to start new Activity
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    
            // Staring Login Activity
            _context.startActivity(i);
        }
    
        /**
         * Quick check for login
         **/
        // Get Login State
        public boolean isLoggedIn() {
            return pref.getBoolean(IS_LOGIN, false);
        }
    }
    

    最后,您必须在活动类的SessionManager方法中创建此onCreate类的实例,然后为将在整个过程中使用的会话调用createLoginSession整个应用程序

    // Session Manager Class
    SessionManager session;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Session Manager
        session = new SessionManager(getApplicationContext());
        session.createLoginSession("Username", intentValue);
    }
    

    我希望它有所帮助。