微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – HTML发布请求(登录表单)

我需要登录一个网站.我尝试通过发送正确的POST请求来存档它.我可以收集所需的数据(两个安全令牌和一个cookie),这似乎没有任何问题.但最终的登录过程不起作用 – 但遗憾的是:我不知道在哪里可以找到问题,因为服务器只是将我重定向登录页面而没有任何提示.
这是我的方法的当前状态:

URL url = new URL("SERVER");
Map<String,Object> params = new LinkedHashMap<>();
params.put("security_token",security_token);
params.put("login_ticket",login_ticket);
params.put("loginname","USERNAME");
params.put("password","PASSWORD");
params.put("login","Login");

StringBuilder postData = new StringBuilder();
for (Map.Entry<String,Object> param : params.entrySet()) {
    if (postData.length() != 0) postData.append('&');
    postData.append(URLEncoder.encode(param.getKey(),"UTF-8"));
    postData.append('=');
    postData.append(URLEncoder.encode(String.valueOf(param.getValue()),"UTF-8"));
}
byte[] postDataBytes = postData.toString().getBytes("UTF-8");

HttpURLConnection conn = (HttpURLConnection) url.openConnection();


conn.setRequestProperty("Cookie",cookie);


conn.setInstanceFollowRedirects(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
conn.setRequestProperty("Content-Length",String.valueOf(postDataBytes.length));
conn.setDoOutput(true);
conn.getoutputStream().write(postDataBytes);

Reader in = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8"));

Map<String,List<String>> headerFields = conn.getHeaderFields();

我已经尝试用C#解决这个问题.下面的代码工作正常,所以我只是试图将它“翻译”成java.

string cookie = "COOKIEVALUE";
request.Host = new Uri("SERVER");
//request.PostData.Add("Cookie",cookies[0]);
request.PostData.Add("loginname","USERNAME");
request.PostData.Add("password","PW");
request.PostData.Add("login_ticket","269ba20ad5a6f1a0219a3a333d3a5997");
request.PostData.Add("security_token","ZHfyszNSuMrN8Xw80Pudka+5cZB20j+or+JWXCWzVPg=");

request.ContentType = "application/x-www-form-urlencoded";
try
{
    request.SendRequest(cookie);
    using (var response = request.GetResponse())
    {
        if (response == null)
            throw new WebException();
        using (var stream = response.GetResponseStream())
        {
            using (var streamReader = new StreamReader(stream))
            {
                string result = streamReader.ReadToEnd();

            }
        }
    }
}
catch (WebException)
{
    throw;
}

和SendRequest方法代码

public void SendRequest(string cookieValue,byte[] buffer = null)
{
    _webRequest = HttpWebRequest.CreateHttp(Host);
    _webRequest.Method = "POST";
    _webRequest.ContentType = ContentType;

    _webRequest.CookieContainer = new CookieContainer();
    var cookie = new Cookie("Seminar_Session",cookieValue);
    cookie.Domain = Host.Host;
    _webRequest.CookieContainer.Add(cookie);

    string postString = "";
    foreach (var item in PostData)
    {
        postString += item.Key + "=" + item.Value + "&";
    }

    if (postString.Length > 0)
        postString = postString.Remove(postString.Length - 1,1);

    byte[] postBuffer = System.Text.Encoding.UTF8.GetBytes(postString);

    _webRequest.ContentLength = postBuffer.Length;
    if (buffer != null) _webRequest.ContentLength += buffer.Length;

    using (var requestStream = _webRequest.GetRequestStream())
    {
        requestStream.Write(postBuffer,postBuffer.Length);
        if (buffer != null) requestStream.Write(buffer,buffer.Length);
        requestStream.Flush();
    }
}

现在我试图让Java代码正常工作.有什么我明显错了吗?遗憾的是,我无法继续使用C#代码,现在需要一个Java工作解决方案.那么,如何使用无效的java版本来解决这个问题呢?

编辑:最后我使用了apache组件来处理这些请求.

String security_token;
    String login_ticket;

    //setup configuration
    RequestConfig globalConfig = RequestConfig.custom().setCookieSpec(CookieSpecs.BEST_MATCH).build();

    HttpClientContext context = HttpClientContext.create();
    context.setCookieStore(_cookieStore);

    //send request to get login data


    Document source;
    security_token = "TOKEN";
    login_ticket = "TICKET";
    HttpPost httppost = new HttpPost("https://www.studip.uni-goettingen.de/");

    // Request parameters and other properties.
    List<NameValuePair> params = new ArrayList<NameValuePair>(2);
    params.add(new BasicNameValuePair("security_token",security_token));
    params.add(new BasicNameValuePair("login_ticket",login_ticket));
    params.add(new BasicNameValuePair("loginname",_credentials.getUserName()));
    params.add(new BasicNameValuePair("password",_credentials.getpassword()));
    httppost.setEntity(new UrlEncodedFormEntity(params,"UTF-8"));

    //Execute the login post request and get the response.
    HttpResponse response = httpClient.execute(httppost,context);
    httpentity entity = response.getEntity();

解决方法

他们使用一些哈希函数生成这些安全令牌.在大多数情况下,这些散列使用完整的形式(包括其中的字段)来制作散列.您的问题可能是您没有使用它,因此哈希值将不相同.如果您重新加载页面,您将看到login_ticket因同样的原因而发生变化.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐