在POST数据后获取页面的重定向URL

时间:2011-08-11 06:12:55

标签: java

我目前有代码将数据发布到可以正常工作的登录页面。但是,在验证登录信息后,我对如何获取页面的URL感到有点迷失。

基本上,我有一个用于发布数据的目标网址,称为login.aspx,然后将其发布回自身,验证登录,然后,如果有效,则转到某个page.aspx?custId = 12345

当我在发布帖子后尝试HTTPUrlConnection的getURL方法时,它返回login.aspx URL而不是我想要的page.aspx URL。我已经尝试了setFollowRedirects(),一旦处于false状态,一旦处于true状态,​​我尝试获取Location头(没有)以及其他任何东西都没有用。

import java.net.*;
import java.io.*;

public class LoginByHttpPost
{
    private static final String POST_CONTENT_TYPE = "application/x-www-form-urlencoded";

    private static final String LOGIN_USER_NAME = "oipsl";
    private static final String LOGIN_PASSWORD = "poker";

    private static final String TARGET_URL = "http://www.clubspeedtiming.com/prkapolei/login.aspx";

    public static void main (String args[])
    {
        System.out.println("Verifying user in Casa De Chad Database");
        LoginByHttpPost httpUrlBasicAuthentication = new LoginByHttpPost();
        httpUrlBasicAuthentication.httpPostLogin();
    }

    /**
     * The single public method of this class that
     * 1. Prepares a login message
     * 2. Makes the HTTP POST to the target URL
     * 3. Reads and returns the response
     *
     * @throws IOException
     * Any problems while doing the above.
     *
     */
    public void httpPostLogin ()
    {
        try
        {
            // Prepare the content to be written
            // throws UnsupportedEncodingException
            String urlEncodedContent = preparePostContent(LOGIN_USER_NAME);

            HttpURLConnection urlConnection = doHttpPost(TARGET_URL, urlEncodedContent);
            urlConnection.setFollowRedirects(true);
            System.out.println(urlConnection.getResponseCode());
            System.out.println(urlConnection.getHeaderFields());

            String response = readResponse(urlConnection);

            System.out.println("Successfully made the HTPP POST.");
            System.out.println("Received response is: " + response);
        }
        catch(IOException ioException)
        {
            System.out.println("Problems encountered.");
        }
    }

    /**
     * Using the given username and password, and using the static string variables, prepare
     * the login message. Note that the username and password will encoded to the
     * UTF-8 standard.
     *
     * @param loginUserName
     * The user name for login
     *
     * @param loginPassword
     * The password for login
     *
     * @return
     * The complete login message that can be HTTP Posted
     *
     * @throws UnsupportedEncodingException
     * Any problems during URL encoding
     */
    private String preparePostContent(String loginUserName) throws UnsupportedEncodingException
    {
        // Encode the user name and password to UTF-8 encoding standard
        // throws UnsupportedEncodingException
        String encodedLoginUserName = URLEncoder.encode(loginUserName, "UTF-8");
        //Hidden fields also used for verification
        String viewState = URLEncoder.encode("/wEPDwULLTIxMTU1NzMyNDgPZBYCAgMPZBYCAgkPPCsADQBkGAEFAmd2D2dkNyI00Mr5sftsfyEsC6YBMNkj9mI=", "UTF-8");
        String eventvalidation = URLEncoder.encode("/wEWBAK2l8HDAQKQoJfyDwK6z/31BQLCi9reA4vQxgNI61f/aeA7+HYbm+y+7y3g", "UTF-8");

        String content = "tbxRacerName="+encodedLoginUserName+"&__VIEWSTATE="+viewState+"&__EVENTVALIDATION="+eventvalidation;

        return content;

    }

    /**
     * Makes a HTTP POST to the target URL by using an HttpURLConnection.
     *
     * @param targetUrl
     * The URL to which the HTTP POST is made.
     *
     * @param content
     * The contents which will be POSTed to the target URL.
     *
     * @return
     * The open URLConnection which can be used to read any response.
     *
     * @throws IOException
     */
    public HttpURLConnection doHttpPost(String targetUrl, String content) throws IOException
    {
        HttpURLConnection urlConnection = null;
        DataOutputStream dataOutputStream = null;
        try
        {
            // Open a connection to the target URL
            // throws IOException
            urlConnection = (HttpURLConnection)(new URL(targetUrl).openConnection());

            // Specifying that we intend to use this connection for input
            urlConnection.setDoInput(true);

            // Specifying that we intend to use this connection for output
            urlConnection.setDoOutput(true);

            // Specifying the content type of our post
            urlConnection.setRequestProperty("Content-Type", POST_CONTENT_TYPE);

            // Specifying the method of HTTP request which is POST
            // throws ProtocolException
            urlConnection.setRequestMethod("POST");

            // Prepare an output stream for writing data to the HTTP connection
            // throws IOException
            dataOutputStream = new DataOutputStream(urlConnection.getOutputStream());

            // throws IOException
            dataOutputStream.writeBytes(content);
            dataOutputStream.flush();
            dataOutputStream.close();

            return urlConnection;
        }
        catch(IOException ioException)
        {
            System.out.println("I/O problems while trying to do a HTTP post.");
            ioException.printStackTrace();

            // Good practice: clean up the connections and streams
            // to free up any resources if possible
            if (dataOutputStream != null)
            {
                try
                {
                    dataOutputStream.close();
                }
                catch(Throwable ignore)
                {
                    // Cannot do anything about problems while
                    // trying to clean up. Just ignore
                }
            }
            if (urlConnection != null)
            {
                urlConnection.disconnect();
            }

            // throw the exception so that the caller is aware that
            // there was some problems
            throw ioException;
        }
    }

    /**
     * Read response from the URL connection
     *
     * @param urlConnection
     * The URLConncetion from which the response will be read
     *
     * @return
     * The response read from the URLConnection
     *
     * @throws IOException
     * When problems encountered during reading the response from the
     * URLConnection.
     */
    private String readResponse(HttpURLConnection urlConnection) throws IOException
    {

        BufferedReader bufferedReader = null;
        try
        {
            // Prepare a reader to read the response from the URLConnection
            // throws IOException
            bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
            HttpURLConnection.setFollowRedirects(false);
            urlConnection.connect();
            System.out.println(urlConnection.getHeaderFields());
            System.out.println("URL: "+urlConnection.getURL());
            String responeLine;

            // Good Practice: Use StringBuilder in this case
            StringBuilder response = new StringBuilder();

            // Read untill there is nothing left in the stream
            // throws IOException
            while ((responeLine = bufferedReader.readLine()) != null)
            {
                response.append(responeLine);
            }

            return response.toString();
        }
        catch(IOException ioException)
        {
            System.out.println("Problems while reading the response");
            ioException.printStackTrace();

            // throw the exception so that the caller is aware that
            // there was some problems
            throw ioException;

        }
        finally
        {
            // Good practice: clean up the connections and streams
            // to free up any resources if possible
            if (bufferedReader != null)
            {
                try
                {
                    // throws IOException
                    bufferedReader.close();
                }
                catch(Throwable ignore)
                {
                    // Cannot do much with exceptions doing clean up
                    // Ignoring all exceptions
                }
            }

        }
    }
}

1 个答案:

答案 0 :(得分:0)

如果没有Location标头,并且followRedirects为true(默认情况下为true),则表示没有重定向。可能是服务器端重定向(转发),它不会更改浏览器URL。使用浏览器登录时,您是否在地址栏中看到page.aspx?custId=12345