关于JAVA模拟登录的问题

首席撸出血 发布于 2016/05/26 17:05
阅读 427
收藏 0

就是我用JAVA代码进行v2ex模拟登录的时候

登录成功,返回状态码为302了

但是我后续再去利用get请求日常任务url的时候,会发现仍然显示没有登录


请各位帮忙看看代码问题在哪里

public class V2exSignIn {
    //用户名
    private final static String NAME = "";
    //密码
    private final static String PASSWORD = "";
    //url
    private final static String URL = "http://www.v2ex.com/signin";
    public static void main(String[] args) {
       
        GetMethod getMethod = new GetMethod(URL);
        HttpClient httpClient = new HttpClient();
        Header cookie = null;
        Cookie[] cookies = null;
        StringBuffer tmpcookies = null;
        // 执行postMethod
        int statusCode = 0;
        try {
           httpClient.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
            getMethod.setRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36 SE 2.X MetaSr 1.0");
            getMethod.setRequestHeader("Connection", "keep-alive");
            statusCode = httpClient.executeMethod(getMethod);
            cookie = getMethod.getResponseHeader("Set-Cookie");
            cookie.setName("Cookie");
            byte[] responseBody = getMethod.getResponseBody();
            String response = new String(responseBody, "utf-8");
            //获取input name为once的value值
            int onceEndPosition = response.indexOf("\" name=\"once\"");
            int onceStartPosition = response.lastIndexOf("\"", onceEndPosition - 1);
            String once = response.substring(onceStartPosition + 1, onceEndPosition);
            //获取用户名的name    是后台生成的
            int nameStartPosition = response.indexOf("<input type=\"text\" class=\"sl\" name=\"");
            String name = response.substring(nameStartPosition + 36, nameStartPosition + 100);
            //获取密码的name    是后台生成
            int passwordStartPosition = response.indexOf("<input type=\"password\" class=\"sl\" name=\"");
            String password = response.substring(passwordStartPosition + 40, passwordStartPosition + 104);
            //在同一个client下进行表单提交
            PostMethod postMethod = new PostMethod(URL);
            postMethod.addParameter(name, NAME);
            postMethod.addParameter(password, PASSWORD);
            postMethod.addParameter("once", once);
            postMethod.addParameter("next", "/");
            cookies = httpClient.getState().getCookies();  
            tmpcookies = new StringBuffer();
            for (Cookie c : cookies) {
                tmpcookies.append(c.toString() + ";");
            }
            postMethod.setRequestHeader("cookie", tmpcookies.toString());
            statusCode = httpClient.executeMethod(postMethod);
            
            //200
            if (statusCode == HttpStatus.SC_OK) {
                System.out.println(":执行结束");
            }
            //302重定向   如果为302的话表示执行成功
            else if (statusCode == HttpStatus.SC_MOVED_TEMPORARILY){
                cookies = httpClient.getState().getCookies();  
                tmpcookies = new StringBuffer();
                for (Cookie c : cookies) {
                    tmpcookies.append(c.toString() + ";");
                }
                getMethod = new GetMethod("http://www.v2ex.com/mission/daily");
                getMethod.setRequestHeader("cookie", tmpcookies.toString());  
                statusCode = httpClient.executeMethod(getMethod);
                responseBody = getMethod.getResponseBody();
                //wrong
                //这里就出现了问题,获取的内容显示的是没登陆
                response = new String(responseBody, "utf-8");
            }
            else {
                System.out.println(":执行异常---------------");
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}



加载中
0
Small-Liu
Small-Liu

1. httpclient可以自己管理cookie,不需要手动控制

2. 把302开启followRedirect功能,httpclient不同版本差异较大,自己查

3. 抓包比较自己程序发的http协议跟浏览器发的有什么不同,可能限制的地方比较多,Referer/User-Agent/Cookie格式

0
首席撸出血
首席撸出血
@南湖船老大  老大这一块你了解不
0
南湖船老大
南湖船老大

你302重定向之后也带上了cookie,思路是没错的。建议你用fiddle抓包一次正常登陆,然后比较你代码和抓包的不同。

打开httpclient的log,可以看到代码的request header.

0
南湖船老大
南湖船老大
我刚刚看了下,302跳转的地址也不是你那个吧,另外带上Referer试试

首席撸出血
首席撸出血
回复 @南湖船老大 : 加了还有没用,我把抓包里post的里面的请求头都拿过来了,除了cookie那一部分
南湖船老大
南湖船老大
回复 @开源中国首席门卫小哥 : 是header里加上这个refer参数
首席撸出血
首席撸出血
302跳转的地址不是我的这个,是不是我在302之后访问refer的地址啊,然后再去请求我要的地址
0
妹子楼顶有鸽子
妹子楼顶有鸽子
把返回的 302的地址带着cookie再次访问一遍。应该是302访问的地址里面新增了一些cookie
妹子楼顶有鸽子
妹子楼顶有鸽子
回复 @开源中国首席门卫小哥 : 返回的地址是http://www.v2ex.com/ 这个吧
首席撸出血
首席撸出血
返回302的是登录,难道我在做一次登录?
0
征途_2005
征途_2005
如果登录接口有验证码怎么办。。
首席撸出血
首席撸出血
验证码的话最好使用Py解决,有专门识别验证码的包。我只是用java试试
返回顶部
顶部