Java 在SharedReference中添加会话信息并检索它
我想在SharedReference中存储会话密钥和其他信息,并在调用其他api时检索它。我引用这个答案-。我创建了一个单独的类MyApp并调用它的方法来存储和检索信息。这是我的第一个项目与会话,所以我不知道很多,但我尝试了这段代码 登录功能Java 在SharedReference中添加会话信息并检索它,java,android,session,sharedpreferences,Java,Android,Session,Sharedpreferences,我想在SharedReference中存储会话密钥和其他信息,并在调用其他api时检索它。我引用这个答案-。我创建了一个单独的类MyApp并调用它的方法来存储和检索信息。这是我的第一个项目与会话,所以我不知道很多,但我尝试了这段代码 登录功能 public void LoginAPI(){ progressDialog.show(); StringRequest stringRequest = new StringRequest(Request.Method.POST, LOGI
public void LoginAPI(){
progressDialog.show();
StringRequest stringRequest = new StringRequest(Request.Method.POST, LOGIN_URL, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
// My Operations with response
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
progressDialog.dismiss();
Snackbar.make(v,"LOGIN FAILED",Snackbar.LENGTH_SHORT).show();
}
}){
@Override
protected Map<String, String> getParams() {
Map<String, String> params = new HashMap<>();
// the POST parameters:
params.put("identity", username);
params.put("pass",password);
return params;
}
//Storing Session Data
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
MyApp.get().checkSessionCookie(response.headers);
return super.parseNetworkResponse(response);
}
};
RequestQueue queue = Volley.newRequestQueue(this);
queue.add(stringRequest);
}
将此行添加到
android:name=“.MyApp”
文件中的应用程序标记中
<application
android:name=".MyApp"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true">
试试看 我要删除
MyApp.get()
,它返回NULL
,并静态调用它,例如:
public static boolean checkSessionCookie(Map<String, String> headers) {
if (headers.containsKey(SET_COOKIE_KEY) && headers.get(SET_COOKIE_KEY).startsWith(SESSION_COOKIE)) {
String cookie = headers.get(SET_COOKIE_KEY);
if (cookie.length() > 0) {
String[] splitCookie = cookie.split(";");
String[] splitSessionId = splitCookie[0].split("=");
cookie = splitSessionId[1];
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
SharedPreferences.Editor prefEditor = preferences.edit();
prefEditor.putString(SESSION_COOKIE, cookie);
prefEditor.commit();
return true;
}
}
return false;
}
publicstaticbooleanchchecksessionokie(映射头){
if(headers.containsKey(SET_COOKIE_KEY)和&headers.get(SET_COOKIE_KEY).startsWith(SESSION_COOKIE)){
字符串cookie=headers.get(设置cookie\u键);
如果(cookie.length()>0){
String[]splitCookie=cookie.split(;);
字符串[]splitSessionId=splitCookie[0]。拆分(“”);
cookie=splitSessionId[1];
SharedReferences preferences=PreferenceManager.GetDefaultSharedReferences(getApplicationContext());
SharedReferences.Editor prefEditor=preferences.edit();
putString(会话_COOKIE,COOKIE);
提交();
返回true;
}
}
返回false;
}
可用相似boolean hascokie=MyApp.checksessionokie(response.headers)代码>
。。。当在Mainfest.xml
中引用MyApp
时,它还应该返回实例,但是具有静态的上下文
字段容易出现上下文
;最好尽可能避免。您只需从静态方法中获取首选项的句柄
;很可能getApplicationContext()
就足以获得句柄。plz显示添加的AndroidManifest.xml文件。请检查@sontruongitOk now错误已消失,但当我在中检索它时,它没有附加会话数据。你们能检查一下我的存储和检索实现是否正确吗?@AjayGohel你们应该在AddSessionOkie和CheckSessionOkie方法上设置一个断点来调试你们的应用程序,看看你们做错了什么或做错了什么。若CheckSessionOkie中的条件得到并解决了问题,它就不会进入内部。字符串会话中出现错误。\u COOKIE。我把它改成了相对字符串,现在它可以工作了。很高兴听到这个消息。快乐编码!
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.acg.digimkeyparent">
<!-- To auto-complete the email text field in the login form with the user's emails -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true">
<activity
android:name=".Slide"
android:theme="@style/Theme.AppCompat.NoActionBar" />
<activity
android:name=".Login"
android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
<activity
android:name=".ForgotPassword"
android:theme="@style/Theme.AppCompat.Light.NoActionBar" />
<activity android:name=".ResetPassword" />
<activity android:name=".EditNumber" />
<activity android:name=".OTP" />
<activity android:name=".ProfileChild" />
<activity
android:name=".SplashScreen"
android:theme="@style/Theme.AppCompat.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name=".GSMRegistrationIntentService"
android:exported="false">
<intent-filter>
<action android:name="com.google.android.gms.iid.InstanceID" />
</intent-filter>
</service>
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" />
<activity android:name=".ChangePassword" />
<activity android:name=".ChangeMobile" />
<activity android:name=".StudentDashboard" />
</application>
</manifest>
E/Volley: [462] NetworkDispatcher.processRequest: Unhandled exception java.lang.NullPointerException: Attempt to invoke virtual method 'void com.example.acg.digimkeyparent.MyApp.checkSessionCookie(java.util.Map)' on a null object reference
java.lang.NullPointerException: Attempt to invoke virtual method 'void com.example.acg.digimkeyparent.MyApp.checkSessionCookie(java.util.Map)' on a null object reference
at com.example.acg.digimkeyparent.Login$5.parseNetworkResponse(Login.java:186)
at com.android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.java:132)
at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:87)
<application
android:name=".MyApp"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true">
public static boolean checkSessionCookie(Map<String, String> headers) {
if (headers.containsKey(SET_COOKIE_KEY) && headers.get(SET_COOKIE_KEY).startsWith(SESSION_COOKIE)) {
String cookie = headers.get(SET_COOKIE_KEY);
if (cookie.length() > 0) {
String[] splitCookie = cookie.split(";");
String[] splitSessionId = splitCookie[0].split("=");
cookie = splitSessionId[1];
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
SharedPreferences.Editor prefEditor = preferences.edit();
prefEditor.putString(SESSION_COOKIE, cookie);
prefEditor.commit();
return true;
}
}
return false;
}