HttpClient 模拟登录保持session并继续进行登录后操作

 公司考勤签到,每天都要登录系统签到,于是就在想:如果可以每天自动签到就好了。

看了http://unmi.cc/httpclient-login-session/这篇微博,也试着写了下。

大概思路是:模拟登录考勤系统,调用“打点接口”.

import org.apache.commons.httpclient.Cookie;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.cookie.CookiePolicy;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;

import com.vortex.sign.vo.ParamVo;

public class HttpClientLoginAndSign {
	
	private static final String SIGN_REQ_URI = "签到接口相对路径";
	private static final String LOGIN_REQ_URI = "登录接口相对路径";
	private static final String REQ_ADDR = "server IP+Port"; 
        //以上参数不方便透露
	
    /**
     * 模拟登录+打点
     * @param pv 数据传递容器
     */	
    public static void loginAndSign(ParamVo pv){
        //模拟登录URL
        String loginUrl = REQ_ADDR+LOGIN_REQ_URI;
		String type = SignTypeHandler.getSignType();
        
        //模拟打点URL+参数
        String dataUrl = REQ_ADDR+SIGN_REQ_URI+"?account="+pv.getUserId()+"&id="+pv.getId()+"&type="+type;
 
        HttpClient httpClient = new HttpClient();
 
        //获得POST请求方法
        PostMethod postMethod = new PostMethod(loginUrl);
        postMethod.setRequestHeader("Referer", 实际值);
        postMethod.setRequestHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2453.0 Safari/537.36");
        //设置登录请求参数
        NameValuePair[] data = {
                new NameValuePair("username", pv.getUsername()),
                new NameValuePair("password", pv.getPassword()),
        };
        postMethod.setRequestBody(data);
 
        try {
            //设置 HttpClient 接收 Cookie,用与浏览器一样的策略
            httpClient.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
            int loginState = httpClient.executeMethod(postMethod);
            System.out.println(loginState);
            //获得登陆后的 Cookie
            Cookie[] cookies=httpClient.getState().getCookies();
            String tmpcookies= "";
            for(Cookie c:cookies){
                tmpcookies += c.toString()+";";
            }
 
            //进行登陆后的操作
            GetMethod getMethod = new GetMethod(dataUrl);
 
            //每次访问需授权的网址时需带上前面的 cookie 作为通行证
            getMethod.setRequestHeader("cookie",tmpcookies);
            
            
            httpClient.executeMethod(getMethod);
        } catch (Exception e) {
            System.out.println("登陆出错------------->"+e.getMessage());
        }   
    }
}

 这一段代码重要的地方就是 getMethod.setRequestHeader("cookie",tmpcookies);

我要测试的系统在登录后将用户的token放入了session中,以后的请求都被过滤器过滤,如果session中没有token,那么就无法完成访问。

所以在签到请求的时候要先把登录后得到的cookie存入到本次的请求中去。

因为cookie中有JSESSIONID,这个就是session标识,server也就是用这个来获取session并使用的。

所以当getMethod设置了cookie后,再去做签到请求,通俗的讲:考勤系统会拿着这个sessionId去寻找session,找到后寻找在登录时已经存入的登录信息。这是一定能找到的,因此是可以请求成功的。


猜你喜欢

转载自vortexchoo.iteye.com/blog/2241620