我正在尝试使用HttpsURLConnection
向服务器请求数据;我目前有一个服务器,要求用户通过提示符输入用户名和密码。在Web浏览器中输入正确的用户名和密码后,浏览器会将用户名和密码作为会话cookie保存在浏览器中,这样您就可以访问站点中的其他页面而无需提示输入凭据。但是对于使用Java的客户端,它不会保存用户名和密码。我正在尝试使用.disconnect()
关闭连接,但是仍然出现以下错误:
java.lang.IllegalStateException: Already connected
at sun.net.www.protocol.http.HttpURLConnection.setRequestProperty(HttpURLConnection.java:3053)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.setRequestProperty(HttpsURLConnectionImpl.java:316)
我的Java代码:
private static void sendPost(String _url) throws Exception {
String url = _url;
URL obj = new URL(url);
HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();
con.setRequestMethod("POST");
int responseCode = con.getResponseCode();
Auth(con);
if (responseCode == 200) {
label.setText("Sucssesfully Scanned: " + StudID.getText());
} else {
label.setText("Error, please scan again");
}
con.disconnect();
}
private static ArrayList<String> Get(String _url) throws Exception {
ArrayList<String> list = new ArrayList<>();
JsonParser parser = new JsonParser();
String url = _url;
URL obj = new URL(url);
HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();
Auth(con);
con.setRequestMethod("GET");
con.setRequestProperty("Accept", "application/json");
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
con.disconnect();
JsonElement element = parser.parse(response.toString());
if (element.isJsonObject()) {
JsonObject data = element.getAsJsonObject();
for (int i = 0; i < data.get("chapels").getAsJsonArray().size(); i++) {
JsonObject jObj = (JsonObject) data.get("chapels").getAsJsonArray().get(i);
list.add(jObj.get("Name").toString().replaceAll("\"", "") + " - " + jObj.get("Loc").toString().replaceAll("\"", ""));
}
}
return (list);
}
private static void Auth(HttpsURLConnection con){
String encodedBytes = Base64.getEncoder().encodeToString((BCrypt.hashpw("swheeler17", BCrypt.gensalt(10)) + ":" + BCrypt.hashpw("Trinity", BCrypt.gensalt(10))).getBytes());
con.setRequestProperty("authorization", "Basic " + encodedBytes);
}
用户名和密码提示示例:https://chapel-logs.herokuapp.com/chapel
答案 0 :(得分:1)
java.lang.IllegalStateException:已连接
该异常表示您已尝试设置属性,该属性为请求发送后赋予授权。
这可能是发生这种情况的地方:
int responseCode = con.getResponseCode();
Auth(con);
和Auth
呼叫setRequestProperty
。
如果尚未发送请求,则请求响应代码将导致发送请求。 (很明显……直到获得响应,您才能获得响应代码,除非发送请求,否则服务器无法给您一个响应代码。)
要回答您的问题,在连接上调用disconnect
将断开连接。
但这不是导致您出现问题的原因。 stacktrace清楚地表明,有人在调用setRequestProperty
时发生了异常。
答案 1 :(得分:0)
根据Stephen C的回答,我确定了交换顺序:
int responseCode = con.getResponseCode();
Auth(con);
因此可行的解决方案是:
Auth(con);
int responseCode = con.getResponseCode();
我假设ResponseCode()
向服务器创建请求(如果尚未发出请求),否则ResponseCode()
使用预先存在的请求。经过进一步测试,我得出结论,不需要致电.disconnect()
。