我想做一个Android端教务系统,通过Volley发送请求。
思路为:1.获取并存储cookie2.保存网页的__VIEWSTATE值3.头信息中带上cookie,下载验证码4.设置头信息post数据
预期是302重定向到首页,但现在却重定向到了错误页面。
post的值都检查过了,__VIEWSTATE也是通过Jsoup获取到,头信息也设置了,fiddle抓包发现cookie也是设置成功了。难道是Android上的缓存缘故吗?
用python又是成功的
实在想不到是什么原因,还望各位大神指教!

出错信息


以下为模拟登录fiddle抓包

获取到cookie


带上cookie下载验证码
[/img]

重定向地址



模拟登录时post数据




以下为浏览器登录的重定向地址及post的数据



以下为实现cookie保存、__VIEWSTATE保持、下载验证码、post数据代码



packagecom.cyj.volley;

importjava.io.UnsupportedEncodingException;
importjava.util.HashMap;
importjava.util.Map;

importorg.json.JSONException;
importorg.json.JSONObject;
importorg.jsoup.Jsoup;
importorg.jsoup.nodes.Document;

importandroid.content.Context;
importandroid.content.SharedPreferences;
importandroid.graphics.Bitmap;
importandroid.graphics.Bitmap.Config;
importandroid.widget.ImageView;
importandroid.widget.Toast;

importcom.android.volley.AuthFailureError;
importcom.android.volley.NetworkResponse;
importcom.android.volley.ParseError;
importcom.android.volley.Request.Method;
importcom.android.volley.RequestQueue;
importcom.android.volley.Response;
importcom.android.volley.VolleyError;
importcom.android.volley.toolbox.HttpHeaderParser;
importcom.android.volley.toolbox.ImageRequest;
importcom.android.volley.toolbox.StringRequest;
importcom.android.volley.toolbox.Volley;
importcom.cyj.util.LogUtil;
importcom.cyj.volleytest.R;

publicclassVolleyManager{

privatestaticVolleyManagervolleyManager;
privatestaticRequestQueuerequestQueue;
privatestaticContextcontext;
privatefinalStringuserAgent="Mozilla/5.0(Linux;Android5.1;GoogleNexus4-5.1.0-API22-768x1280Build/LM";

privateVolleyManager(){
requestQueue=Volley.newRequestQueue(context);
}

publicstaticVolleyManagergetInstance(){
if(volleyManager==null){
synchronized(VolleyManager.class){
if(volleyManager==null){
volleyManager=newVolleyManager();
}
}
}
returnvolleyManager;
}


/**
*获取cookie并保持
*
*@paramurl
**/
privatevoid_stringRequestGet(Stringurl){
StringRequeststringRequest=newStringRequest(url,
newResponse.Listener<String>(){

@Override
publicvoidonResponse(Stringresponse){
Documentdoc=Jsoup.parse(response);
String__VIEWSTATE=doc.select("input").first().attr("value");
saveSettingNote("VIEWSTATE",__VIEWSTATE);
// LogUtil.i("VolleyManager","_stringRequestGet,__VIEWSTATE="+__VIEWSTATE);
}
},
newResponse.ErrorListener(){

@Override
publicvoidonErrorResponse(VolleyErrorerror){
LogUtil.e("VolleyManager",error.getMessage(),error);
}
}){
@Override
protectedResponse<String>parseNetworkResponse(
NetworkResponseresponse){
try{
Map<String,String>map=response.headers;
Stringcookie=map.get("Set-Cookie").trim().split(";")[0];
saveSettingNote("cookie",cookie);
// LogUtil.i("VolleyManager","_stringRequestGet,cookie="+cookie);
Stringdata=newString(response.data,"UTF-8");
returnResponse.success(data,
HttpHeaderParser.parseCacheHeaders(response));
}catch(UnsupportedEncodingExceptione){
returnResponse.error(newParseError(e));
}
}
};
requestQueue.add(stringRequest);
}

privatevoid__stringRequestGet(Stringurl){
finalMap<String,String>headers=newHashMap<String,String>();
StringRequeststringRequest=newStringRequest(url,
newResponse.Listener<String>(){

@Override
publicvoidonResponse(Stringresponse){
LogUtil.d("VolleyManager","__stringRequestGet,response="+response);
}
},newResponse.ErrorListener(){

@Override
publicvoidonErrorResponse(VolleyErrorarg0){

}
}){
@Override
publicMap<String,String>getHeaders()
throwsAuthFailureError{
Stringcookie=getSettingNote("cookie");
headers.put("Cookie",cookie);
headers.put("X-Requested-With","com.android.browser");
headers.put("Referer","http://jw1.wucc.cn/default2.aspx");
headers.put("User-Agent",userAgent);
returnheaders;
}
};
}


/**
*带上cookie下载验证码
*
*@paramurl
*@paramimg
**/
privatevoid_downloadImage(Stringurl,finalImageViewimg){
ImageRequestimageRequest=newImageRequest(url,
newResponse.Listener<Bitmap>(){

@Override
publicvoidonResponse(Bitmapbitmap){
img.setImageBitmap(bitmap);
}
},0,0,Config.RGB_565,
newResponse.ErrorListener(){

@Override
publicvoidonErrorResponse(VolleyErrorerror){
img.setImageResource(R.drawable.ic_launcher);
}
}){
@Override
publicMap<String,String>getHeaders()
throwsAuthFailureError{
Map<String,String>headers=newHashMap<String,String>();
Stringcookie=getSettingNote("cookie");
headers.put("Cookie",cookie);
// LogUtil.i("VolleyManager","_downloadImage,cookie="+cookie);
headers.put("X-Requested-With","com.android.browser");
headers.put("Referer","http://jw1.wucc.cn/");
headers.put("User-Agent",userAgent);
// LogUtil.i("VolleyManager","_downloadImage,headers="+headers);
returnheaders;
}
};
requestQueue.add(imageRequest);
}

/**
*添加头信息POST发送数据
*
*@paramurl
*@paramusername
*@parampassword
*@paramcheckcode
**/
privatevoid_stringRequestPost(Stringurl,finalMap<String,String>headers,
finalMap<String,String>data){
StringRequeststringRequest=newStringRequest(Method.POST,url,
newResponse.Listener<String>(){

@Override
publicvoidonResponse(Stringresponse){
LogUtil.e("VolleyManager","_stringRequestPost,response="+response);
}
},
newResponse.ErrorListener(){

@Override
publicvoidonErrorResponse(VolleyErrorerror){
LogUtil.e("VolleyManager",error.getMessage(),error);
}
}){
@Override
publicMap<String,String>getHeaders()
throwsAuthFailureError{
Stringcookie=getSettingNote("cookie");
headers.put("Cookie",cookie);
headers.put("User-Agent",userAgent);
headers.put("X-Requested-With","com.android.browser");
// LogUtil.i("VolleyManager","_stringRequestPost,headers="+headers.toString());
returnheaders;
}
@Override
protectedMap<String,String>getParams()
throwsAuthFailureError{
data.put("__VIEWSTATE",getSettingNote("VIEWSTATE"));
// LogUtil.i("VolleyManager","_stringRequestPost,data="+data.toString());
returndata;
}
@Override
protectedResponse<String>parseNetworkResponse(
NetworkResponseresponse){
Stringstr=null;
try{
str=newString(response.data,"gb2312");
}catch(UnsupportedEncodingExceptione){
e.printStackTrace();
}
returnResponse.success(str,HttpHeaderParser.parseCacheHeaders(response));
}
};
requestQueue.add(stringRequest);
}



/***********************对外方法***********************/

publicstaticvoidsetContext(Contextcontext){
VolleyManager.context=context;
}

publicstaticvoidstringRequestGet(Stringurl){
getInstance()._stringRequestGet(url);
}

publicstaticvoiddownloadImage(Stringurl,ImageViewimg){
getInstance()._downloadImage(url,img);
}

publicstaticvoidstringRequestPost(Stringurl,Map<String,String>headers,
Map<String,String>data){
getInstance()._stringRequestPost(url,headers,data);
}

publicstaticvoid_stringRequestPost(Stringurl){
getInstance().__stringRequestGet(url);
}

/************************辅助方法*************************/
/**
*保存cookie
**/
privatevoidsaveSettingNote(Stringkey,Stringvalue){
SharedPreferences.Editornote=context.getSharedPreferences("values",
Context.MODE_PRIVATE)
.edit();
note.putString(key,value);
//LogUtil.d("VolleyManager","savesettingnote,data="+value);
note.commit();
}

/**
*读取cookie
**/
privateStringgetSettingNote(Stringkey){
SharedPreferencesread=context.getSharedPreferences("values",Context.MODE_PRIVATE);
//LogUtil.d("VolleyManager","getsettingnote,data="+read.getString(key,""));
returnread.getString(key,"");
}

}



先在这里谢过各位!

2 个解决方案

#1


论坛都没人吗?

更多相关文章

  1. Android中复杂Json数据的解析
  2. 无法从Android中的Asset文件夹复制数据库
  3. 关于activity之间及activity与baseAdapter,activity与Fragment的
  4. Android防止活动被回收而丢失数据
  5. Android之SQLite数据库篇
  6. 关于android中sharedpreferences数据不更新的问题
  7. Java项目无法通过BufferedWriter向服务器写数据?
  8. Android(监听+回调=观察者)模式从Dialog到Activity传递数据
  9. android获取网络数据

随机推荐

  1. Golang 是面向对象还是面向过程?
  2. golang吉祥物是啥?
  3. Golang 和 PHP 哪个性能更强?
  4. golang会代替java吗?
  5. Golang 底层也用 Golang 吗?
  6. golang和哪种语言像?
  7. golang和nodejs的区别是什么?
  8. golang如何连接mysql
  9. golang如何读取文件
  10. golang和go语言有区别吗?