我需要登录一个网站.我尝试通过发送正确的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; }
…
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();
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。