Java 登录后丢失会话
我正在构建一个需要登录到某个页面并进行导航的应用程序。我可以登录,只要响应包含标识它的字符串。但当我导航到第二个页面时,我无法将该页面视为已登录用户,只能将其视为匿名用户 我将提供我的代码:Java 登录后丢失会话,java,login,Java,Login,我正在构建一个需要登录到某个页面并进行导航的应用程序。我可以登录,只要响应包含标识它的字符串。但当我导航到第二个页面时,我无法将该页面视为已登录用户,只能将其视为匿名用户 我将提供我的代码: import java.net.*; import java.security.*; import java.security.cert.*; import javax.net.ssl.*; import java.io.*; import java.util.*; public class PostTe
import java.net.*;
import java.security.*;
import java.security.cert.*;
import javax.net.ssl.*;
import java.io.*;
import java.util.*;
public class PostTest {
static HttpsURLConnection conn = null;
static String sessionId = null;
private static class DefaultTrustManager implements X509TrustManager {
@Override
public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}
@Override
public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}
public static void main(String[] args) {
try {
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(new KeyManager[0], new TrustManager[] {new DefaultTrustManager()}, new SecureRandom());
SSLContext.setDefault(ctx);
String data = URLEncoder.encode("txtUserName", "UTF-8") + "=" + URLEncoder.encode(/*username*/, "UTF-8");
data += "&" + URLEncoder.encode("txtPassword", "UTF-8") + "=" + URLEncoder.encode(/*password*/", "UTF-8");
data += "&" + URLEncoder.encode("envia", "UTF-8") + "=" + URLEncoder.encode("1", "UTF-8");
connectToSSL(/*login url*/);
//throws java.lang.IllegalStateException: Already connected
conn.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
wr.write(data);
wr.flush();
BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line;
String resposta = "";
while((line = rd.readLine()) != null) {
resposta += line + "\n";
}
System.out.println("valid login -> " + resposta.contains(/*string that assures me I'm looged in*/));
connectToSSL(/*first navigation page*/);
rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
while((line = rd.readLine()) != null) {
System.out.println(line);
}
} catch(Exception e) {
e.printStackTrace();
}
}
private static void connectToSSL(String address) {
try {
URL url = new URL(address);
conn = (HttpsURLConnection) url.openConnection();
conn.setHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String arg0, SSLSession arg1) {
return true;
}
});
if(sessionId == null) {
sessionId = conn.getHeaderField("Set-Cookie");
}
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
要了解更多信息,请询问。在
connectToSSL
中,您每次都会打开一个新连接。在第二个连接中,它将不具有来自第一个连接的任何属性
您可能希望在首次登录连接后设置get-some token/cookie值,并在后续调用中使用相同的值,例如
第一次连接后:
String sessionId = conn.getHeaderField("Set-Cookie");
在随后的连接中:
conn.setRequestProperty("Cookie", sessionId );
看看apachecommons项目。它将帮助你完成你想要完成的事情。您需要比URL类复杂得多的时间。从一个身份验证请求到后续的身份验证请求,它需要维护大量信息。您正在访问的站点可能使用cookie来识别登录的会话。您需要在第一次请求时保存cookies集,并在后续请求时发送它们
如果您使用的是HttpsUrlConnection,请参阅和。另一个选择是默认情况下哪一个进行cookie管理。http是一个无状态协议。 要保留状态(会话),请存储从服务器接收的cookie。
List cookies=conn.getHeaderFields().get(“设置Cookie”)代码>
在后续请求中将它们发送到服务器
for (String cookie : cookies) {
//从cookie中删除过期日期和路径
String cookieValue=cookie.substring(0,cookie.indexOf(“;”);
conn.addRequestProperty(“Cookie”,cookieValue);
}
OutputStreamWriter wr=新的OutputStreamWriter(conn.getOutputStream());
wr.write(data);
没错,我现在看到了。那么,我该如何更改当前连接的URL?不确定,如果我没有弄错您的问题?如果是关于访问第二个URL,除了调用conn.setRequestProperty()之外,只需执行您正在执行的操作
在您尝试从第二个连接打开流之前。是的,我这样做了,但我遇到了一个异常,告诉我我已经打开了一个连接。您可能希望在打印值后关闭第一个连接。您在哪一行遇到此错误?听起来很奇怪。如果您不介意,可以添加更新吗在你的问题中添加完整的代码,并在行中突出显示问题行和注释?我会看一看,但现在我很好奇如何更改HttpsURLConnection的url。谢谢,Altound。