最近在做一个学校查课表的apk,其中需要用httpclient模拟一次校网登陆的请求,下面的这个截图是在电脑上用ie浏览器登陆时,在httpwathc里面查看到的,说明登陆的时候中间是有一次重定向的处理的。 昨天查资料的时候,看到别人说get请求会自动处理重定向,要在参数里面设置一下才能进制httpclient自动处理重定向,但是我用的是post请求,因为要传递参数,所以昨天我就在这个帖子里面问post请求有没有类似的方法来禁止httpclient来自动处理重定向。 但是早上我查资料的时候,发现用post和put方法访问时,在httpclient里面是无法完成自动重定向的,所以就不需要考虑怎样去禁止自动处理重定向了。 现在我的问题是什么呢,重定向访问的响应消息的状态码应该是302,对吧,从我这个截图里面也可以看到,第一次是302,浏览器重定向访问,第二次才是200,而且第一次是post请求,第二次是get请求,,但是我在代码里面用post访问时,它的状态码是200,我就很纳闷。 可能有人问我传递的参数有没有问题,下面第二张是我用httpwatch查看的浏览器传参的截图,我在代码里面也是一样的,应该没问题。 最下面是我的代码,,,因为是自学,网上资料也很少,很乱,,所以感觉很头疼,,希望大神能指导指导。 十分感谢! public class MainActivity extends Activity { final String HUPE_LOGIN = "http://jwgl.hbpu.edu.cn/(m2html45co445eunb4vp30fv)/default2.aspx"; // url的前缀部分,中间的安全验证部分,以及最后的包含学生个人信息的供get方法访问的参数部分,在、三者合起来才是最后的url String urlPrefix = "http://jwgl.hbpu.edu.cn"; String urlFromHead = ""; // "/(m2html45co445eunb4vp30fv)/xxx"格式,前面有斜杠,后面无斜杠 String urlParsered = "";// 前面无斜杠,在前面要记得加"/" HttpClient client; HttpResponse response; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); client = new DefaultHttpClient(); } // 这是和按钮绑定的一个方法,apk运行后点击界面上的按钮,就可以开始模拟一次登陆了 public void startTest(View v) { new Thread() { public void run() { printText(); }; }.start(); } public void printText() { if (login()) { String redirectLocation = getRedirectLocation(); if (redirectLocation != null) { System.out.println(getText(redirectLocation)); } } } // 模拟登陆 private boolean login() { HttpPost post = new HttpPost(HUPE_LOGIN); // 用键值对存放参数 List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("TextBox1", "201140430124")); params.add(new BasicNameValuePair("TextBox2", "201140430124")); try { post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); // 发送post请求 response = client.execute(post); } catch (Exception e) { e.printStackTrace(); return false; } finally { // 终止此次post访问 post.abort(); } return true; } // 获取包含重定向信息的头字段 private String getRedirectLocation() { // 用httpwatch查看时,可以看到post请求的响应消息状态吗是302,里面有location字段 // 但是在模拟器上debug时,响应消息的状态行的状态吗是200,而且里面没有location字段 Header locationHeader = response.getFirstHeader("Location"); if (locationHeader == null) { return null; } return locationHeader.getValue(); } /* * @param redirectLocation 重定向的地址 * * @return 根据重定向得到的网页内容 */ private String getText(String redirectLocation) { // HttpGet httpget = new HttpGet(redirectLocation); // Create a response handler ResponseHandler<String> responseHandler = new BasicResponseHandler(); String responseBody = ""; try { responseBody = client.execute(httpget, responseHandler); } catch (Exception e) { e.printStackTrace(); responseBody = null; } finally { httpget.abort(); client.getConnectionManager().shutdown(); } return responseBody; } } |
|
25分 |
Get和Post都是封装好的。所以会自动重定向,
如果你用最原始的socket链接的,就不会重定向了。。 |
因为要模拟登陆,,纯粹用socket来处理,,,会感觉好无力啊 |
|
25分 |
其实你只要用httpclient请求登陆就行了,重定向它会帮你处理好,session会自动放入HttpClient?对象里,接下来对该网站的请求,需要用同一个client对象
|
我一开始是那样让他请求登陆的,,不过好像没登上去,,返回的结果不是预期的,没有登陆成功,这个人的问题跟我的也一样,http://bbs.csdn.net/topics/390039402?page=1#post-397057246 不过我现在在想登录失败,是不是我登陆的有问题 |
|
25分 |
现在才忙完,才看到你给我的留言,HttpClient是android提供的方法类,你可以看下api,用HttpClient就会重定向了,,,
|
问题解决了,,还是我一直担心的问题,,由于自己的知识问题看不到那个高度,或者由于误导所以走了错路,才导致自己解决不了的问题,,,如果问题的本身就有问题,,那么这个问题就没有意义了,,, 解决问题了很高兴,,,进来的每个人给十分,,,快来拿呀~~~~ |
|
25分 |
|
LZ 我和你一样的情况啊,我们做的都是正方教务系统的,基本参数和你的一样,一开始因为那段万恶的安全码问题,我需要获取到他,作为重定向后提交参数的地址,和你一样普通java项目中可以看到有重定向的过程,但是在android项目中就没有了.因为登录需要用到账号密码,还有那个验证码,我是想从验证码那里获取到验证码后根据这个安全码加上/default2.aspx地址作为提交参数的地址.就是没有重定向,导致我一直没有成功,后来看到你这个使用了安全码的地址,我直接把他固定下来,测试了,竟然成功了.
另外,我不明白的就是你说的那段安全码的问题,他是怎么产生的,我每次打开他的主页,然后他就会重定向,后面加了一大段安全码,但是那个安全码貌似只是有长度作用,没有什么特殊意义,我随便修改了那段安全码照样能登录, |
|
怎么解决的??? |
|
同样的问题 求助,楼主还记得这个问题不?
|
|
楼主还在么,我现在的毕设,跟你差不多,以为内我看到你们的学校的网站和我们学校的是一个公司的。。。现在求救啊,学长,看到一定要尽快回复啊,小弟快纠结死了,卡在那动不了了!
|
|
学长你还在吗,我也遇到登陆地额问题,想请教一下啊,看到一定要回复小弟啊 |