java模拟用户登录(实现自动签到)-aspx

版权声明:本文为博主原创文章,如需转载请注明出处 https://blog.csdn.net/u013640004/article/details/52677804

刚来公司上班,发现需要自己每天都登录内部网进行签到,然后因为我健忘和怕麻烦,所以就有了它。

首先,我向你们推荐一款抓包软件,​Fiddler Web Debugger,可以用来抓取浏览器与服务器之间传输的数据,方便模拟。看图,点击软件左边的链接可以看到与其相关的数据。

点击软件左边的链接可以看到与其相关的数据

登录时访问的所有链接

这是请求头,还有表单数据WebFroms等等

有了这些数据,我们就可以原样不动的发给服务器,达到了模拟的效果。

其中主要是一些网站的身份验证机制,我在这一方面还是一天经验的小白而已,有那句说那句。

在身份验证里面,有很多网站都是会将​SessionId的值传到本地用Cookie保存起来的,而登录后,网站大多只通过Session来判断用户的有效性。

所以现在我们要做的就是,登录,从返回的Cookie信息中获取有效的SessionId值,然后在随后的访问中,携带上这个SessionId的值就可以一路绿灯了。

另外,就aspx的网页验证,其一般会在表单中添加__VIEWSTATE,__EVENTVALIDATION等字段值作为验证用户正常操作的一个条件。当然,这在Fiddler Web Debugger的眼皮底下是一目了然的。

原理很简单,下面给出关键的网络访问代码。

项目包下载地址:https://yunpan.cn/cBsDXLbaICHIC 访问密码 5a02

//sUrl是访问链接,param是post提交的参数。

public String mySendPost(String sUrl,String param)

{

    PrintWriter out = null;

    BufferedReader in = null;

    String result = "";

    try {

        URL url = new URL(sUrl);
        HttpURLConnection conn = (HttpURLConnection)   url.openConnection();//编写请求头
        //将sessionId的值写入Cookie,ASPXAUTH为空,这里可以不要(按照具体的验证机制来写)
        conn.setRequestProperty("Cookie", sessionId+ASPXAUTH);
        conn.setRequestProperty("Host", "http://192.168.0.200");
        conn.setRequestProperty("accept",
                      "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
        conn.setRequestProperty("connection", "Keep-Alive");
        conn.setRequestProperty("user-agent",
         "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.63 Safari/537.36");
        conn.setRequestProperty("Upgrade-Insecure-Requests", "1");
        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        conn.setRequestProperty("Accept-Encoding", "gzip, deflate");
        conn.setRequestProperty("Accept-Language", "zh-CN,zh;q=0.8");
        conn.setRequestProperty("Referer", lastUrl);//上一页面的链接(一些系统会对此进行判断)
        lastUrl = sUrl;//赋值该当前访问链接为上一页面的链接
        conn.setRequestMethod("POST");// 提交模式
        // 发送POST请求必须设置如下两行
        conn.setDoOutput(true);
        conn.setDoInput(true);
        //获取输出流
        out = new PrintWriter(conn.getOutputStream());

            // 发送请求参数

            out.print(param);

            // flush输出流的缓冲

            out.flush();

            // 定义BufferedReader输入流来读取URL的响应

            in = new BufferedReader(

                    new InputStreamReader(conn.getInputStream(),"UTF-8"));

            //读取返回结果

            String line;

            while ((line = in.readLine()) != null) {

                result += line;

            }

            Map> map = conn.getHeaderFields();

            //printCookie(map);//输出浏览器发给我们的所有请求头

            getSessionId(map);//从请求头中获取SessionId

} catch (MalformedURLException e) {

e.printStackTrace();

} catch (ProtocolException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

        finally{

            try{

                if(out!=null){

                    out.close();

                }

                if(in!=null){

                    in.close();

                }

            }

            catch(IOException ex){

                ex.printStackTrace();

            }

        }

        //System.out.println("获取结果:"+result);

        return result;

}

private void printCookie(Map> map)

{

System.out.println("输出Cookie:");

for(String key :map.keySet())

        {

        System.out.println("key= "+ key + " and value= " + map.get(key));

        }

}

private void getSessionId(Map> map)

{

List sResult = map.get("Set-Cookie");//从请求头中获取Cookie信息

        if(sResult!=null&&sResult.size()>1)//从Cookie中获取SessionId

        {

            sessionId = sResult.get(1);

            sessionId = sessionId.substring(0, sessionId.indexOf(";")+1);

            System.out.println("获取sessionId:"+sessionId);

        }

}

猜你喜欢

转载自blog.csdn.net/u013640004/article/details/52677804