【问题标题】:Handling php Session in Android across multiple Activities跨多个活动处理Android中的php Session
【发布时间】:2017-08-29 01:16:56
【问题描述】:

我正在尝试使用 php Joomla API 为我的应用程序实现服务器端。用户发送登录信息和服务器进程并成功创建会话。但是,我无法在 android 中捕获此会话数据。我正在使用 volley 来执行帖子,但是多个帖子似乎会创建新的登录名,这不应该是用户已经登录的情况。我猜他们是 volley 发送标题的问题。任何对此有解决方案的人都将不胜感激。 注意服务器端工作 100%。问题只出在安卓上。

protected void doLogin(){
    final String username = editTextUsername.getText().toString().trim();
    final String password = editTextPassword.getText().toString().trim();

    final CookieManager cookieManager = new CookieManager(new PersistentCookieStore(getApplicationContext()), CookiePolicy.ACCEPT_ORIGINAL_SERVER);
    CookieHandler.setDefault(cookieManager);

    RequestQueue queue  = Volley.newRequestQueue(this);
    String loginUrl     ="http://loginurl/sesslogin/";

    final StringRequest stringRequest = new StringRequest(Request.Method.POST, loginUrl,
       new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                //COOKIE_JAR  = cookieManager.getCookieStore().getCookies().toString();
                //PersistentCookieStore.getCookies();
               // Toast.makeText(getApplicationContext(), response, Toast.LENGTH_LONG).show();
                //stringRequest.getHeaders().values()

                Toast.makeText(getApplicationContext(), response , Toast.LENGTH_LONG).show();
            }
       },
       new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(getApplicationContext(), "That didn't work!", Toast.LENGTH_LONG).show();
            }
        }
    ){
        @Override
        protected Map<String,String> getParams(){
            Map<String,String> params = new HashMap<String, String>();
            params.put(KEY_USERNAME,username);
            params.put(KEY_PASSWORD,password);
            return params;
        }
    };

    queue.add(stringRequest);
}

我还在 Github 上找到了共享首选项和 cookie 管理器的实现,它是我的代码的一部分。但我看不出这段代码有什么影响。

public class PersistentCookieStore implements CookieStore {

/**
 * The default preferences string.
 */
private final static String PREF_DEFAULT_STRING = "";

/**
 * The preferences name.
 */
private final static String PREFS_NAME = PersistentCookieStore.class.getName();

/**
 * The preferences session cookie key.
 */
private final static String PREF_SESSION_COOKIE = "Set-Cookie";

private CookieStore mStore;
private Context mContext;

/**
 * @param context The application context
 */
public PersistentCookieStore(Context context) {
    // prevent context leaking by getting the application context
    mContext = context.getApplicationContext();

    // get the default in memory store and if there is a cookie stored in shared preferences,
    // we added it to the cookie store
    mStore = new CookieManager().getCookieStore();
    String jsonSessionCookie = getJsonSessionCookieString();
    if (!jsonSessionCookie.equals(PREF_DEFAULT_STRING)) {
        Gson gson = new Gson();
        HttpCookie cookie = gson.fromJson(jsonSessionCookie, HttpCookie.class);
        mStore.add(URI.create(cookie.getDomain()), cookie);
    }
}

@Override
public void add(URI uri, HttpCookie cookie) {
    if (cookie.getName().equals("sessionid")) {
        // if the cookie that the cookie store attempt to add is a session cookie,
        // we remove the older cookie and save the new one in shared preferences
        remove(URI.create(cookie.getDomain()), cookie);
        saveSessionCookie(cookie);
    }

    mStore.add(URI.create(cookie.getDomain()), cookie);
}

@Override
public List<HttpCookie> get(URI uri) {
    return mStore.get(uri);
}

@Override
public List<HttpCookie> getCookies() {
    return mStore.getCookies();
}

@Override
public List<URI> getURIs() {
    return mStore.getURIs();
}

@Override
public boolean remove(URI uri, HttpCookie cookie) {
    return mStore.remove(uri, cookie);
}

@Override
public boolean removeAll() {
    return mStore.removeAll();
}

private String getJsonSessionCookieString() {
    return getPrefs().getString(PREF_SESSION_COOKIE, PREF_DEFAULT_STRING);
}

/**
 * Saves the HttpCookie to SharedPreferences as a json string.
 *
 * @param cookie The cookie to save in SharedPreferences.
 */
private void saveSessionCookie(HttpCookie cookie) {
    Gson gson = new Gson();
    String jsonSessionCookieString = gson.toJson(cookie);
    SharedPreferences.Editor editor = getPrefs().edit();
    editor.putString(PREF_SESSION_COOKIE, jsonSessionCookieString);
    editor.apply();
}

private SharedPreferences getPrefs() {
    return mContext.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
}

}

【问题讨论】:

    标签: android session joomla android-volley


    【解决方案1】:

    我已经确定了问题。所以我会为遇到同样问题的人回答这个问题。问题就在这里;

    final CookieManager cookieManager = new CookieManager(new PersistentCookieStore(getApplicationContext()), CookiePolicy.ACCEPT_ORIGINAL_SERVER);
    CookieHandler.setDefault(cookieManager);
    

    由于某种原因,这个 CookieManager 应该在 onCreate 方法期间被实例化。这里也不需要 final 类型。我的最终代码如下;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        //INSTANTIATE COOKIE MANAGER
        CookieManager cookieManager = new CookieManager(new PersistentCookieStore(this.getApplicationContext()), CookiePolicy.ACCEPT_ORIGINAL_SERVER);
        CookieHandler.setDefault(cookieManager);
        doLogin();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-19
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      • 1970-01-01
      相关资源
      最近更新 更多