最近我在为自己的网站做app的时候,遇到了一个问题,就是无法记录用户的登录状态。手机的每次普通的请求,服务器都会将其认为新用户请求。这是什么原因呢?其实,就是因为手机的每次请求都没有带上服务器在第一次被请求时返回的Cookie,这样没有Cookie的请求,服务器就会默认为新用户,这就导致无法无法记录登陆状态的问题的出现。
为此,我选择了Volley。
什么是Volley框架呢?它适合进行小数据、多频发的网络操作,以及图片的加载,然而有个缺点:对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。
今天我就给大家带来volley框架获取cookie和带cookie的请求教程。
android端模拟浏览器访问的思路:
1、通过框架获取第一次登陆成功访问返回的Cookie
2、用SharedPreferences保存Cookie
3、每次请求都将保存的Cookie放在请求头部
下面我就为大家献上主要代码:
一、保存Cookie的方法:
private void saveSettingNote(String s,String saveData){//保存设置
SharedPreferences.Editor note = getSharedPreferences(Config.ShareTo,MODE_PRIVATE).edit();
note.putString(s, saveData);
note.commit();
}
二、从记录中获取Cookie的方法:
private String getSettingNote(String s){//获取保存设置
SharedPreferences read = getSharedPreferences(Config.ShareTo, MODE_PRIVATE);
return read.getString(s, "");
}
三、第一次请求获取Cookie:
RequestQueue mQueue = Volley.newRequestQueue(this);
StringRequest stringRequest = new StringRequest(Request.Method.POST, Config.url+"/port/login_port.ashx", new Response.Listener<String>() {
@Override
public void onResponse(String s) {
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {}
}) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> map = new HashMap<String, String>();
return map;
}
@Override
protected Response<String> parseNetworkResponse(NetworkResponse response) {
try {
Map<String, String> responseHeaders = response.headers;
String rawCookies = responseHeaders.get("Set-Cookie");
saveSettingNote(Config.Cookie,rawCookies);//保存Cookie
Log.i("px",rawCookies+"\n");
String dataString = new String(response.data, "UTF-8");
Log.i("px",dataString);
return Response.success(dataString, HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
}
}
};
mQueue.add(stringRequest);
四、带Cookie的请求
RequestQueue mQueue = Volley.newRequestQueue(this);
StringRequest stringRequest = new StringRequest(Request.Method.GET, Config.url+"/port/get_category_port.ashx", new Response.Listener<String>() {
@Override
public void onResponse(String s) {
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
}
}) {
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
HashMap localHashMap = new HashMap();
localHashMap.put("Cookie", getSettingNote(Config.Cookie));//向请求头部添加Cookie
return localHashMap;
}
};
mQueue.add(stringRequest);
好了,就这些了。希望对你有帮助。有错误的话,麻烦指出来,感激不尽。