httpurlconnection 非法状态异常:已连接
httpurlconnection illegal state exception : already connected
我正在尝试 post 参数并从输入流中读取重定向页面,但我对这个异常一无所知
Exception in thread "main" java.lang.IllegalStateException: Already connected
at java.net.URLConnection.setDoOutput(URLConnection.java:900)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.setDoOutput(HttpsURLConnectionImpl.java:455)
at com.company.Main.main(Main.java:58)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
代码:
try {
CookieHandler cookieHandler = null;
CookieManager.setDefault(cookieHandler);
HttpURLConnection urlConnection = (HttpURLConnection) new URL("site").openConnection();
InputStream i = new BufferedInputStream(urlConnection.getInputStream());
StringBuilder stringBuilder =new StringBuilder();
int c;
while ((c=i.read())!=-1){
stringBuilder.append((char)c);
}
// for getting the post paramters that is user name and password field
Pattern p = Pattern.compile("<input name=\"\w{22}\" type=\"text\" id=\"\w{22}\" />");
Matcher matcher = p.matcher(stringBuilder.toString());
String user_name = null;
while (matcher.find()){
user_name = matcher.group().split("\"")[1];
}
String password = null;
p= Pattern.compile("<input name=\"\w{22}\" type=\"password\" id=\"\w{22}\" />");
matcher= p.matcher(stringBuilder.toString());
while (matcher.find()){
password = matcher.group().split("\"")[1];
}
System.out.print(user_name + " " + password);
String urlParameters = user_name+"=xyz&"+password+"=xyz";
byte[] postData = urlParameters.getBytes( StandardCharsets.UTF_8 );
int postDataLength = postData.length;
urlConnection.setDoOutput(true);
urlConnection.setDoInput(true);
urlConnection.setRequestMethod("POST");
urlConnection.setRequestMethod(Integer.toString(postDataLength));
Writer writer = new BufferedWriter(new OutputStreamWriter(urlConnection.getOutputStream()));
writer.write(urlParameters);
writer.flush();
urlConnection.setDoInput(true);
urlConnection.getContent();
while ((c=i.read())!=-1){
System.out.print((char)c);
}
} catch (IOException e) {
e.printStackTrace();
}
您需要调用 urlConnection.setDoInput(true)
、urlConnection.setDoOutput(true)
、urlConnection.setRequestMethod("POST")
、urlConnection.setRequestMethod(Integer.toString(postDataLength))
以及任何其他在调用 urlConnection.getInputStream()
和 urlConnection.getOutputStream()
因为这些方法实际上会启动请求,所以一旦调用修改请求就太晚了,这就是你得到这个 Exception
.
的原因
响应更新
您实际面临的主要问题是您想要重用 HttpURLConnection
而它并不意味着要重用,这就是为什么您会收到此异常,您需要创建每个 HTTP 请求一个新的 HttpURLConnection
。
我正在尝试 post 参数并从输入流中读取重定向页面,但我对这个异常一无所知
Exception in thread "main" java.lang.IllegalStateException: Already connected
at java.net.URLConnection.setDoOutput(URLConnection.java:900)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.setDoOutput(HttpsURLConnectionImpl.java:455)
at com.company.Main.main(Main.java:58)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
代码:
try {
CookieHandler cookieHandler = null;
CookieManager.setDefault(cookieHandler);
HttpURLConnection urlConnection = (HttpURLConnection) new URL("site").openConnection();
InputStream i = new BufferedInputStream(urlConnection.getInputStream());
StringBuilder stringBuilder =new StringBuilder();
int c;
while ((c=i.read())!=-1){
stringBuilder.append((char)c);
}
// for getting the post paramters that is user name and password field
Pattern p = Pattern.compile("<input name=\"\w{22}\" type=\"text\" id=\"\w{22}\" />");
Matcher matcher = p.matcher(stringBuilder.toString());
String user_name = null;
while (matcher.find()){
user_name = matcher.group().split("\"")[1];
}
String password = null;
p= Pattern.compile("<input name=\"\w{22}\" type=\"password\" id=\"\w{22}\" />");
matcher= p.matcher(stringBuilder.toString());
while (matcher.find()){
password = matcher.group().split("\"")[1];
}
System.out.print(user_name + " " + password);
String urlParameters = user_name+"=xyz&"+password+"=xyz";
byte[] postData = urlParameters.getBytes( StandardCharsets.UTF_8 );
int postDataLength = postData.length;
urlConnection.setDoOutput(true);
urlConnection.setDoInput(true);
urlConnection.setRequestMethod("POST");
urlConnection.setRequestMethod(Integer.toString(postDataLength));
Writer writer = new BufferedWriter(new OutputStreamWriter(urlConnection.getOutputStream()));
writer.write(urlParameters);
writer.flush();
urlConnection.setDoInput(true);
urlConnection.getContent();
while ((c=i.read())!=-1){
System.out.print((char)c);
}
} catch (IOException e) {
e.printStackTrace();
}
您需要调用 urlConnection.setDoInput(true)
、urlConnection.setDoOutput(true)
、urlConnection.setRequestMethod("POST")
、urlConnection.setRequestMethod(Integer.toString(postDataLength))
以及任何其他在调用 urlConnection.getInputStream()
和 urlConnection.getOutputStream()
因为这些方法实际上会启动请求,所以一旦调用修改请求就太晚了,这就是你得到这个 Exception
.
响应更新
您实际面临的主要问题是您想要重用 HttpURLConnection
而它并不意味着要重用,这就是为什么您会收到此异常,您需要创建每个 HTTP 请求一个新的 HttpURLConnection
。