Java 以编程方式登录网站将返回登录的HTML

Java 以编程方式登录网站将返回登录的HTML,java,html,Java,Html,我有下面的Java程序,它应该以编程方式登录到我的学生网站,并返回成绩册的HTML。但是,当我运行它时,会返回实际登录站点的HTML: 我最初尝试将初始POST请求发送到inspect element()的network选项卡中显示的请求URL,但是,这将返回一个错误,并且没有HTML数据。感谢您的帮助,因为这是我第一次尝试这种性质的东西 更新:在尝试登录过程后,我注意到我获得的cookie只包含“lastvisit=95FD925038EF488AA22719B64FB5C4A3”的内容,但缺

我有下面的Java程序,它应该以编程方式登录到我的学生网站,并返回成绩册的HTML。但是,当我运行它时,会返回实际登录站点的HTML:

我最初尝试将初始POST请求发送到inspect element()的network选项卡中显示的请求URL,但是,这将返回一个错误,并且没有HTML数据。感谢您的帮助,因为这是我第一次尝试这种性质的东西

更新:在尝试登录过程后,我注意到我获得的cookie只包含“lastvisit=95FD925038EF488AA22719B64FB5C4A3”的内容,但缺少“JSESSION_ID”。我不确定这是否是导致问题的原因

更新#2我编辑了我的代码以符合提供的建议,但是,我仍然得到登录页面的HTML而不是成绩数据页面。另外,我添加了print语句来显示我获得的cookie,我注意到缺少“JsessionID”cookie,而我只获得了“lastvisited”cookie

我的cookie print语句的输出如下(出于实验目的)


GET URL实际响应返回的html。您需要特定的html,并且可以使用不同的端点实际返回所需的html。以下是一些建议:

  • 登录请求必须是POST请求,而不是GET请求
  • 您需要为登录POST请求提供cookie。因此,您可能希望首先向服务器发出get请求,并在随后的POST中使用Set Cookie响应值

  • 此站点正在使用JavaServlet身份验证机制。当您尝试获取任何受密码保护的页面时,服务器会在内部发出一个转发,返回登录页面内容。发布有效用户名/密码后,它会将您转发到请求的URL

    请注意,这不是重定向,它由应用程序服务器内部管理,客户端看不到服务器端发生了什么

    要使其正常工作,您需要发出一个get命令,以访问您试图检索的页面。服务器以登录页面内容和会话id作为cookie进行响应。您必须保存会话id,并在发布到表单操作时将其发送

    由于我没有有效的证书进行测试,我不能保证这会起作用。如果凭据无效,服务器将发出大量重定向,这些重定向最终将更改会话,可能是因为会话已无效并已重新创建

    请使用有效凭据尝试此操作,并让我知道它是否有效。如果成功登录时有重定向,则可能需要禁用自动重定向并以编程方式执行,检查会话id的更改。根据应用服务器的不同,它可能会出于安全目的更改会话id

    也就是说,当您发布有效凭据时,这可能会起作用

    import java.io.BufferedReader;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.net.URLEncoder;
    import java.util.List;
    import java.util.ListIterator;
    import java.util.Map;
    
    public class Scraper {
    
        private static final String USERNAME = "user@test.com";
        private static final String PASSWORD = "secret";
        private static final String GET_URL  = "https://parents.mtsd.k12.nj.us/genesis/parents?tab1=studentdata&tab2=gradebook&tab3=weeklysummary&studentid=100916&action=form";
        private static final String POST_URL = "https://parents.mtsd.k12.nj.us/genesis/j_security_check";
    
        public static void main(String[] args) {
            String cookies = doGet(GET_URL);
            doPost(POST_URL, cookies);
        };
    
        /**
         * Send the initial GET request which will forward to the login page
         * and retrieve cookies sent by the server.
         * Cookies are formatted according to HTTP specification so they can be
         * passed to the next request Cookie header.
         * @param getURL URL to get
         */
        public static String doGet(String getURL) {
            StringBuilder formattedCookies = new StringBuilder();
            try {
                URL url = new URL(getURL);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                InputStream is = conn.getInputStream();
                Map<String, List<String>> headers = conn.getHeaderFields();
                List<String> cookies = headers.get("Set-Cookie");
                ListIterator<String> it = cookies.listIterator();
                while (it.hasNext()) {
                    String[] parts = it.next().split("; ");
                    formattedCookies.append(parts[0]);
                    if (it.hasNext()) {
                        formattedCookies.append("; ");
                    }
                }
                System.out.println("\n\nGET OUTPUT");
                printContent(is);
            } catch (Exception e) {
                System.out.println(e.getLocalizedMessage());
            }
            return formattedCookies.toString();
        }
    
        /**
         * Post the form parameters and get page content.
         * @param postURL URL to post to
         * @param cookies The cookies to send
         */
        public static void doPost(String postURL, String cookies) {
            try {
                String postData = String.format("j_username=%s&j_password=%s",
                    URLEncoder.encode(USERNAME, "UTF-8"), PASSWORD);
                URL url = new URL(postURL);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setRequestMethod("POST");
                conn.setDoOutput(true);
                conn.setInstanceFollowRedirects(true);
                conn.setRequestProperty("Cookie", cookies);
                OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream());
                out.write(postData);
                out.close();
                InputStream is = conn.getInputStream();
                System.out.println("\n\nPOST OUTPUT");
                printContent(is);
            } catch (Exception e) {
                System.out.println(e.getLocalizedMessage());
            }
        }    
    
        public static void printContent(InputStream is) throws IOException {
            BufferedReader reader = new BufferedReader(new InputStreamReader(is));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
        }
    
    }
    
    导入java.io.BufferedReader;
    导入java.io.DataOutputStream;
    导入java.io.IOException;
    导入java.io.InputStream;
    导入java.io.InputStreamReader;
    导入java.io.OutputStreamWriter;
    导入java.net.HttpURLConnection;
    导入java.net.URL;
    导入java.net.urlcoder;
    导入java.util.List;
    导入java.util.ListIterator;
    导入java.util.Map;
    公共类刮刀{
    私有静态最终字符串用户名=”user@test.com";
    私有静态最终字符串PASSWORD=“secret”;
    私有静态最终字符串GET_URL=”https://parents.mtsd.k12.nj.us/genesis/parents?tab1=studentdata&tab2=gradebook&tab3=weeklysummary&studentid=100916&action=form";
    私有静态最终字符串POST_URL=”https://parents.mtsd.k12.nj.us/genesis/j_security_check";
    公共静态void main(字符串[]args){
    字符串cookies=doGet(获取URL);
    doPost(发布URL、cookies);
    };
    /**
    *发送初始GET请求,该请求将转发到登录页面
    *并检索服务器发送的cookie。
    *Cookie是根据HTTP规范格式化的,因此可以
    *传递到下一个请求Cookie头。
    *@param getURL要获取的URL
    */
    公共静态字符串doGet(字符串getURL){
    StringBuilder formattedCookies=新StringBuilder();
    试一试{
    URL=新URL(getURL);
    HttpURLConnection conn=(HttpURLConnection)url.openConnection();
    InputStream is=conn.getInputStream();
    Map headers=conn.getHeaderFields();
    List cookies=headers.get(“Set Cookie”);
    ListIterator it=cookies.ListIterator();
    while(it.hasNext()){
    String[]parts=it.next().split(;);
    格式化cookies.append(部分[0]);
    if(it.hasNext()){
    格式化cookies.append(“;”);
    }
    }
    System.out.println(“\n\n设置输出”);
    印刷内容(is);
    }捕获(例外e){
    System.out.println(e.getLocalizedMessage());
    }
    返回格式化的cookies.toString();
    }
    /**
    *发布表单参数并获取页面内容。
    *@param postURL要发布到的URL
    *@param cookies要发送的cookies
    */
    公共静态void doPost(字符串姿势、字符串cookie){
    试一试{
    String postData=String.format(“j_用户名=%s&j_密码=%s”,
    URLEncoder.encode(用户名,“UTF-8”),密码);
    URL=新URL(姿势);
    HttpURLConnection conn=(HttpURLConnection)url.openConnection();
    conn.setRequestMethod(“POST”);
    连接设置输出(真);
    conn.setInstanceFollowRedirects(真);
    conn.setRequestProperty(“Cookie”,cookies);
    OutputStreamWriter out=新的OutputStreamWriter(conn.getOutputStream());
    写出(postDa
    
    public class Scraper {
    
    static String formData = "user&pass";
    static String link = "https://parents.mtsd.k12.nj.us/genesis/parents?tab1=studentdata&tab2=gradebook&tab3=weeklysummary&studentid=100916&action=form";
    
    
    public static void main (String[] args){
    
       String display = postData(link,formData);
       System.out.print(display);
    
    
    }
    
    public static String postData (String url, String data){
    
        URL link = null;
        HttpURLConnection connection = null;
        StringBuffer stringBuffer = new StringBuffer();
        DataOutputStream dataOutputStream = null;
        String document = null;
    
        try {
            link = new URL(url);
        }catch (Exception e){System.out.print(e);}
    
        try {
            connection = (HttpURLConnection) link.openConnection();
            connection.setRequestMethod("GET");
        }catch (Exception e){System.out.print(e);}
    
        connection.setRequestProperty("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
        connection.setRequestProperty("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36");
        connection.setRequestProperty("Accept-Encoding","gzip, deflate, br");
        connection.setRequestProperty("Accept-Language","en-US,en;q=0.8");
        connection.setRequestProperty("Cookie","");
        connection.setDoInput(true);
        connection.setDoOutput(true);
        //connection.setInstanceFollowRedirects(true);
    
        //setCookie(connection);
    
        String cookie = connection.getHeaderField("Set-Cookie"); //get cookies for session
    
    
        //try {
        //    connection.connect();
        //}catch (Exception e){System.out.print(e);}
    
        //try {
        //    dataOutputStream = new DataOutputStream(connection.getOutputStream());
        //}catch (Exception e){System.out.print(e);}
    
        //try {
        //    IOUtils.write(stringBuffer.toString(),dataOutputStream,"UTF-8");
        //}catch (Exception e){System.out.print(e);}
    
        //handle redirects
        try {
    
                //post data
                String postString = data;
                stringBuffer.append(postString);
    
                URL redURL = null;
    
                try {
                    redURL = new URL("https://parents.mtsd.k12.nj.us/genesis/j_security_check");
                }catch (Exception e){System.out.print(e);}
    
                connection = (HttpURLConnection)redURL.openConnection();
                connection.setRequestMethod("POST");
                connection.setRequestProperty("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
                connection.setRequestProperty("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36");
                connection.setRequestProperty("Accept-Encoding","gzip, deflate, br");
                connection.setRequestProperty("Accept-Language","en-US,en;q=0.8");
                connection.setRequestProperty("Cookie",cookie);
                connection.setDoInput(true);
                connection.setDoOutput(true);
                connection.setInstanceFollowRedirects(true);
    
                //connection.connect();
    
        }catch (Exception e){System.out.print(e);}
    
        InputStream inputStream = null;
    
        String cookie2 = null;
    
        try {
                dataOutputStream = new DataOutputStream(connection.getOutputStream());
            }catch (Exception e){System.out.print(e);}
    
            try {
                IOUtils.write(stringBuffer.toString(),dataOutputStream,"UTF-8");
    
                System.out.println(stringBuffer.toString());
    
                cookie2 = connection.getHeaderField("Set-Cookie"); //get cookies for session
    
            }catch (Exception e){System.out.print(e);}
    
        URL fLink = null;
    
        try {
            fLink = new URL("https://parents.mtsd.k12.nj.us/genesis/parents?tab1=studentdata&tab2=gradebook&tab3=weeklysummary&studentid=100916&action=form" + stringBuffer.toString());
        }catch (Exception e){System.out.print(e);}
    
        HttpURLConnection conn = null;
    
        try {
             conn = (HttpURLConnection) fLink.openConnection();
            conn.setRequestMethod("GET");
        }catch (Exception e){System.out.print(e);}
    
        conn.setRequestProperty("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
        conn.setRequestProperty("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36");
        conn.setRequestProperty("Accept-Encoding","gzip, deflate, br");
        conn.setRequestProperty("Accept-Language","en-US,en;q=0.8");
        conn.setRequestProperty("Cookie",cookie);
        conn.setDoInput(true);
        conn.setDoOutput(true);
    
    
    
            try {
    
                conn.connect();
                inputStream = conn.getInputStream();
    
            document = IOUtils.toString(inputStream,"UTF-8");
    
        } catch (Exception e){System.out.print(e);}
    
        System.out.println("cookie -- " + cookie);
        System.out.println("cookie2 -- " + cookie2);
    
    
        return document;
    }
    }
    
    cookie -- lastvisit=A1753DA7F2454A03B58DF8CBD39C22C4; Expires=Tue,   27-Mar-2018 18:27:55 GMT
    cookie2 -- null
    
    import java.io.BufferedReader;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.net.URLEncoder;
    import java.util.List;
    import java.util.ListIterator;
    import java.util.Map;
    
    public class Scraper {
    
        private static final String USERNAME = "user@test.com";
        private static final String PASSWORD = "secret";
        private static final String GET_URL  = "https://parents.mtsd.k12.nj.us/genesis/parents?tab1=studentdata&tab2=gradebook&tab3=weeklysummary&studentid=100916&action=form";
        private static final String POST_URL = "https://parents.mtsd.k12.nj.us/genesis/j_security_check";
    
        public static void main(String[] args) {
            String cookies = doGet(GET_URL);
            doPost(POST_URL, cookies);
        };
    
        /**
         * Send the initial GET request which will forward to the login page
         * and retrieve cookies sent by the server.
         * Cookies are formatted according to HTTP specification so they can be
         * passed to the next request Cookie header.
         * @param getURL URL to get
         */
        public static String doGet(String getURL) {
            StringBuilder formattedCookies = new StringBuilder();
            try {
                URL url = new URL(getURL);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                InputStream is = conn.getInputStream();
                Map<String, List<String>> headers = conn.getHeaderFields();
                List<String> cookies = headers.get("Set-Cookie");
                ListIterator<String> it = cookies.listIterator();
                while (it.hasNext()) {
                    String[] parts = it.next().split("; ");
                    formattedCookies.append(parts[0]);
                    if (it.hasNext()) {
                        formattedCookies.append("; ");
                    }
                }
                System.out.println("\n\nGET OUTPUT");
                printContent(is);
            } catch (Exception e) {
                System.out.println(e.getLocalizedMessage());
            }
            return formattedCookies.toString();
        }
    
        /**
         * Post the form parameters and get page content.
         * @param postURL URL to post to
         * @param cookies The cookies to send
         */
        public static void doPost(String postURL, String cookies) {
            try {
                String postData = String.format("j_username=%s&j_password=%s",
                    URLEncoder.encode(USERNAME, "UTF-8"), PASSWORD);
                URL url = new URL(postURL);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setRequestMethod("POST");
                conn.setDoOutput(true);
                conn.setInstanceFollowRedirects(true);
                conn.setRequestProperty("Cookie", cookies);
                OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream());
                out.write(postData);
                out.close();
                InputStream is = conn.getInputStream();
                System.out.println("\n\nPOST OUTPUT");
                printContent(is);
            } catch (Exception e) {
                System.out.println(e.getLocalizedMessage());
            }
        }    
    
        public static void printContent(InputStream is) throws IOException {
            BufferedReader reader = new BufferedReader(new InputStreamReader(is));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
        }
    
    }
    
     public static String postData(String url, String data){               
           try { 
    
    OkHttpClient client = new OkHttpClient().newBuilder()
           .connectTimeout(180, TimeUnit.SECONDS)
           .readTimeout(300, TimeUnit.SECONDS)
           .writeTimeout(300, TimeUnit.SECONDS).build();
    
    
    
    
    
    
    MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded"); 
              RequestBody body = RequestBody.create(mediaType, data);
     Request request = new Request.Builder()
    .url(url)
    .post(body)
     .addHeader("Accept","text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8")
     .addHeader("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36")
     .addHeader("Accept-Encoding","gzip, deflate, br")
    .addHeader("Accept-Language","en-US,en;q=0.8")
     .build();
    String body = client.newCall(request).execute().body().string();
      return  body;
    
    
             }catch(Exception e){ e.printStackTrace();  return “An error occurred”; }                                        
        }
    
        List<String> cookies = connection.getHeaderFields().get("Set-Cookie");
        for (String cookie : cookies) {
            connection.addRequestProperty("Cookie", cookie.split(";", 2)[0]);
        }
    
    import java.io.DataOutputStream;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.util.List;
    
    import org.apache.commons.io.IOUtils;
    
    public class Scraper {
    
    static String formData = "j_username=user&j_password=pass";
    static String link = "https://parents.mtsd.k12.nj.us/genesis/parents?tab1=studentdata&tab2=gradebook&tab3=weeklysummary&studentid=100916&action=form";
    
    public static void main(String[] args) {
    
        String display = postData(link, formData);
        System.out.print(display);
    
    }
    
    public static String postData(String url, String data) {
    
        URL link = null;
        HttpURLConnection connection = null;
        StringBuffer stringBuffer = new StringBuffer();
        DataOutputStream dataOutputStream = null;
        String document = null;
    
        try {
            link = new URL(url);
        } catch (Exception e) {
            System.out.print(e);
        }
    
        try {
            connection = (HttpURLConnection) link.openConnection();
            connection.setRequestMethod("GET");
        } catch (Exception e) {
            System.out.print(e);
        }
    
        connection.setRequestProperty("Accept",
                "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
        connection.setRequestProperty("User-Agent",
                "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36");
        connection.setRequestProperty("Accept-Encoding", "gzip, deflate, br");
        connection.setRequestProperty("Accept-Language", "en-US,en;q=0.8");
        // connection.setRequestProperty("Cookie","JSESSIONID=82714DD38C05837934F515C5E0BFD1E3;
        // lastvisit=3626F6FB689948B09CEF3DDA56116B7C");
        connection.setDoInput(true);
        connection.setDoOutput(true);
        // connection.setInstanceFollowRedirects(true);
    
        // setCookie(connection);
    
        // String cookie = connection.getHeaderField("Set-Cookie"); //get
        // cookies for session
        List<String> cookies = connection.getHeaderFields().get("Set-Cookie");
    
        // try {
        // connection.connect();
        // }catch (Exception e){System.out.print(e);}
    
        // try {
        // dataOutputStream = new
        // DataOutputStream(connection.getOutputStream());
        // }catch (Exception e){System.out.print(e);}
    
        // try {
        // IOUtils.write(stringBuffer.toString(),dataOutputStream,"UTF-8");
        // }catch (Exception e){System.out.print(e);}
    
        // handle redirects
        try {
    
            // post data
            String postString = data;
            stringBuffer.append(postString);
    
            URL redURL = null;
    
            try {
                redURL = new URL("https://parents.mtsd.k12.nj.us/genesis/j_security_check");
            } catch (Exception e) {
                System.out.print(e);
            }
    
            connection = (HttpURLConnection) redURL.openConnection();
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Accept",
                    "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
            connection.setRequestProperty("User-Agent",
                    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36");
            connection.setRequestProperty("Accept-Encoding", "gzip, deflate, br");
            connection.setRequestProperty("Accept-Language", "en-US,en;q=0.8");
            // connection.setRequestProperty("Cookie",cookie);
            for (String cookie : cookies) {
                connection.addRequestProperty("Cookie", cookie.split(";", 2)[0]);
            }
            connection.setDoInput(true);
            connection.setDoOutput(true);
            connection.setInstanceFollowRedirects(true);
    
            // connection.connect();
    
        } catch (Exception e) {
            System.out.print(e);
        }
    
        InputStream inputStream = null;
    
        String cookie2 = null;
    
        try {
            dataOutputStream = new DataOutputStream(connection.getOutputStream());
        } catch (Exception e) {
            System.out.print(e);
        }
    
        try {
            IOUtils.write(stringBuffer.toString(), dataOutputStream, "UTF-8");
    
            System.out.println(stringBuffer.toString());
    
            cookie2 = connection.getHeaderField("Set-Cookie"); // get cookies
                                                                // for session
    
        } catch (Exception e) {
            System.out.print(e);
        }
    
        URL fLink = null;
    
        try {
            fLink = new URL(
                    "https://parents.mtsd.k12.nj.us/genesis/parents?tab1=studentdata&tab2=gradebook&tab3=weeklysummary&studentid=100916&action=form"
                            + stringBuffer.toString());
        } catch (Exception e) {
            System.out.print(e);
        }
    
        HttpURLConnection conn = null;
    
        try {
            conn = (HttpURLConnection) fLink.openConnection();
            conn.setRequestMethod("GET");
        } catch (Exception e) {
            System.out.print(e);
        }
    
        conn.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
        conn.setRequestProperty("User-Agent",
                "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36");
        conn.setRequestProperty("Accept-Encoding", "gzip, deflate, br");
        conn.setRequestProperty("Accept-Language", "en-US,en;q=0.8");
        // conn.setRequestProperty("Cookie",cookie);
        for (String cookie : cookies) {
            conn.addRequestProperty("Cookie", cookie.split(";", 2)[0]);
        }
        conn.setDoInput(true);
        conn.setDoOutput(true);
    
        try {
    
            conn.connect();
            inputStream = conn.getInputStream();
    
            document = IOUtils.toString(inputStream, "UTF-8");
    
        } catch (Exception e) {
            System.out.print(e);
        }
    
        for (String cookie : cookies) {
            System.out.println("cookie -- " + cookie);
        }
    
        System.out.println("cookie2 -- " + cookie2);
    
        return document;
    }
    }