JAVA模拟登录实例

来源:互联网 发布:用java打印空心菱形 编辑:程序博客网 时间:2024/04/29 03:06

最近在做公司一个web项目,要求在我们的系统上,能够显示其他网站上的数据。

刚开始接到这个任务时,还在想,简单的很,直接用UrlConection直接进入该网页,然后获取该网页的html,取到想要的数据,返回给我们的系统的前台页面,打印出来。还想到了设计模式,以便今后扩展至能够查看多个网页。

可是,思路是简单的,真正做的时候却乱了思路。。。这个网页还要登录。。。


于是在网上找模拟登录的实例。查了一下,思路是这样的:

a)先把帐号与密码加如到请求中。然后进行登录

b)在登录之后,获取登录的cookie

c)根据获取的cookie,再访问你想要的去的地址。


与之前的区别是,在输出流中,增加账户名和密码,代码如下

StringBuffer sb = new StringBuffer();  sb.append("email="+usr);  sb.append("&password="+pwd);  OutputStream os = connection.getOutputStream(); os.write(sb.toString());  
但是执行的时候,返回的html却是没有登录的页面。发现还是由于登录的时候出现错误,cookie也没有收到。

那么问题就来了,登录网页到底哪家强?

这个email和password这两个参数,我用的是html帐号和密码元素的id,这两个参数名对吗?这两个还要其他值吗?这个方式到底对不对?

然后又在网上继续探索。。。


于是出现了下面的代码:

package com.task;import java.util.ArrayList;import java.util.List;import org.apache.http.Header;import org.apache.http.HttpResponse;import org.apache.http.NameValuePair;import org.apache.http.client.CookieStore;import org.apache.http.client.ResponseHandler;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.cookie.Cookie;import org.apache.http.impl.client.BasicResponseHandler;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.message.BasicNameValuePair;import org.apache.http.protocol.HTTP;public class RenRen {    // The configuration items    private static String userName = "你的帐号";    private static String password = "你的密码";    private static String redirectURL = "http://jk.coolchuan.com/report/total-downloads";    // Don't change the following URL    private static String renRenLoginURL = "http://www.coolchuan.com/sign_in";    // The HttpClient is used in one session    private HttpResponse response;    private DefaultHttpClient httpclient = new DefaultHttpClient();    private boolean login() {        HttpPost httpost = new HttpPost(renRenLoginURL);        // All the parameters post to the web site        List<NameValuePair> nvps = new ArrayList<NameValuePair>();        nvps.add(new BasicNameValuePair("redirect_uri", ""));        nvps.add(new BasicNameValuePair("user[remember_me]", "1"));        nvps.add(new BasicNameValuePair("user[email]", userName));        nvps.add(new BasicNameValuePair("user[password]", password));        try {            httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));            response = httpclient.execute(httpost);            CookieStore cookieStore = httpclient.getCookieStore();            List<Cookie> cookies = cookieStore.getCookies();            for(Cookie c : cookies) {            System.out.println("#############"+c);            }        } catch (Exception e) {            e.printStackTrace();            return false;        } finally {            httpost.abort();        }        return true;    }    private String getRedirectLocation() {    Header[] headers = response.getAllHeaders();    for(int i = 0; i < headers.length; i++) {    System.out.println(headers[i]);    }        Header locationHeader = response.getFirstHeader("Location");        if (locationHeader == null) {            return null;        }        return locationHeader.getValue();    }    private String getText(String redirectLocation) {        HttpGet httpget = new HttpGet(redirectLocation);        // Create a response handler        ResponseHandler<String> responseHandler = new BasicResponseHandler();        String responseBody = "";        try {            responseBody = httpclient.execute(httpget, responseHandler);        } catch (Exception e) {            e.printStackTrace();            responseBody = null;        } finally {            httpget.abort();            httpclient.getConnectionManager().shutdown();        }        return responseBody;    }    public void printText() {        if (login()) {//            String redirectLocation = getRedirectLocation();            if (redirectURL != null) {                System.out.println(getText(redirectURL));            }        }    }    public static void main(String[] args) {        RenRen renRen = new RenRen();        renRen.printText();    }}


第27行,就是登录的url,第24行是重定向的url,也就是登录后我想要跳转到的url


那么问题又来了,第37行到第40行,帐号,密码为什么要这样写?怎么多出了个redirect_uri和user[remember_me]?

做过web的同学都清楚,在登录页面提交请求的时候,其实就是提交一个表单,需要在请求中加入参数,后台在接的时候,根据接到的参数,进行判断,接到的参数是否正确,进而返回前台是否登录成功。如果成功,则进入成功跳转页面,如果不成功,则还是登录页面,提示信息,”登录失败“。

请求的参数名,是需要通过工具查看的。

我推荐用firefox的firebug。Firebug的网络监视器同样是功能强大的,能够查看HttpRequests请求的http头等等。下面给出具体查看过程:

1、打开火狐浏览器,按F12打开firebug,打开网络选项卡(如果是第一次打开,则需要点击“启动”按钮),点击”保持“



2、地址栏输入网页url,这里输入的是 http://www.coolchuan.com/sign_in,再点击“清除”,把多余的网络请求清掉

3、输入帐号密码,然后登录,查看网络情况,找到Post的请求,如下图:



哈哈,想要的参数来了。这个参数就是模拟登录的关键点。看来最初的设想都是错误的。

这里也出来了一个很严重的网站的漏洞,请同学们自行寻找吧,嘿嘿。


1 1
原创粉丝点击