- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
让我的代码以编程方式登录任何 URL 的唯一方法是使用 CookieHandler.setDefault(new CookieManager);
。这很好,但我想了解 cookie 在每个新 HttpsURLConnection
之间是如何维护的.
有人可以展示如何让下面的代码登录 Gmail 帐户而不必使用 CookieHandler.setDefault(new CookieManager);
?谢谢。
**注释:
- 替换为您自己的电子邮件和密码。
-CookieHandler.setDefault(new CookieManager);
在下面的代码中被注释掉了。
public class GmailApp {
private List<String> cookies;
private HttpsURLConnection conn;
public static void main(String[] args) throws Exception {
String url = "https://accounts.google.com/ServiceLoginAuth";
String gmail = "https://mail.google.com/mail/";
GmailApp http = new GmailApp();
// CookieHandler.setDefault(new CookieManager());
String page = http.GetPageContent(url);
String postParams = http.getFormParams(page, "myemail@gmail.com", "mypassword");
http.sendPost(url, postParams);
String result = http.GetPageContent(gmail);
System.out.println(result);
}
private void sendPost(String url, String postParams) throws Exception {
URL obj = new URL(url);
conn = (HttpsURLConnection) obj.openConnection();
conn.setDoOutput(true);
DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
wr.writeBytes(postParams);
wr.flush();
wr.close();
int responseCode = conn.getResponseCode();
System.out.println("\nSending 'POST' request to URL : " + url);
System.out.println("Post parameters : " + postParams);
System.out.println("Response Code : " + responseCode);
BufferedReader in =
new BufferedReader(new InputStreamReader(conn.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
}
private String GetPageContent(String url) throws Exception {
URL obj = new URL(url);
conn = (HttpsURLConnection) obj.openConnection();
conn.setRequestMethod("GET");
conn.setUseCaches(false);
if (cookies != null) {
for (String cookie : this.cookies) {
conn.addRequestProperty("Cookie", cookie.split(";", 1)[0]);
}
}
int responseCode = conn.getResponseCode();
System.out.println("\nSending 'GET' request to URL : " + url);
System.out.println("Response Code : " + responseCode);
BufferedReader in =
new BufferedReader(new InputStreamReader(conn.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
setCookies(conn.getHeaderFields().get("Set-Cookie"));
return response.toString();
}
public String getFormParams(String html, String username, String password)
throws UnsupportedEncodingException {
System.out.println("Extracting form's data...");
Document doc = Jsoup.parse(html);
Element loginform = doc.getElementById("gaia_loginform");
Elements inputElements = loginform.getElementsByTag("input");
List<String> paramList = new ArrayList<String>();
for (Element inputElement : inputElements) {
String key = inputElement.attr("name");
String value = inputElement.attr("value");
if (key.equals("Email"))
value = username;
else if (key.equals("Passwd"))
value = password;
paramList.add(key + "=" + URLEncoder.encode(value, "UTF-8"));
}
StringBuilder result = new StringBuilder();
for (String param : paramList) {
if (result.length() == 0) {
result.append(param);
} else {
result.append("&" + param);
}
}
return result.toString();
}
public void setCookies(List<String> cookies) {
this.cookies = cookies;
}
}
最佳答案
当您通过 java.net.CookieHandler.setDefault()
静态设置默认 CookieHandler
时,当前和 future 的 HttpURLConnection
(通过其底层 HTTP 客户端类)将检查此默认 cookie 处理程序是否存在,找到它后将使用它来检索请求的 cookie,并存储设置/返回的新 cookie。只要您想在所有请求中维护 cookie,这就会提供一个静态 cookie-jar。请务必设置所需的 CookiePolicy
,否则 java.net.CookiePolicy.ACCEPT_ORIGINAL_SERVER
为默认值。
请注意,您的代码存在一些问题:
cookie.split(";", 1)[0]
这个分割不会做任何事情,如果你想从第一个分号截断字符串,你需要 cookie.split(";", 2)[0]
(1->2)从此。
此外,您仅在 GET 请求后调用 setCookies
- 您还需要捕获 POST 登录响应中的 cookie。
关于java - Java 类 CookieHandler 和 CookieManager 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29873713/
我需要访问一些网页并像浏览器一样传递 cookie。这很容易使用 CookieHandler.setDefault(new MyCookieManager()); 但这引入了我需要避免的全局状态(想象
我不知道 CookieHandler 如何在系统范围内工作,我确实查看了 CookieHandler 的源代码,但除了 get/set 方法外没有找到更多信息。 TCP/HTTP 连接在哪里使用我设置
我有一个使用 HttpURLConnection 发出 HTTP 请求的 Web 应用程序。我需要它来处理cookie。我知道只需添加一行代码即可轻松完成,例如 CookieHandler.setDe
我使用以下命令向站点发出 HTTP 请求: //第一次调用服务器时执行 static { cookieManager = new CookieManager(); co
要在 HttpURLConnection 中的每个请求后保留 cookie,应该在开始的应用程序上添加 CookieHandler: CookieManager cookieManager = new
让我的代码以编程方式登录任何 URL 的唯一方法是使用 CookieHandler.setDefault(new CookieManager); 。这很好,但我想了解 cookie 在每个新 Http
我想使用youtube API制作youtube cookie的缩略图。 在google上搜索后,我发现了两种在Android中实现cookie的方法。 CookieHandler和 org.apac
我在管理 OkHttp 和 Cookies 方面遇到了麻烦。 我正在使用带有 CookieManager 的自定义 OkHttpClient 创建 Retrofit 客户端。 final OkHttp
我目前在我的 Mac (macOS Sierra) 上安装了 Jmeter 3.2。现在我想安装 3.1,因为 jmeter ERROR o.a.j.p.h.c.HC4 CookieHandler:
我的简单 Apache HttpClient (4.0.1) 客户端应用程序在 main() 方法中向服务器 URL 发出 HttpGet 请求并打印响应。启动时,应用程序在静态 block 中注册
我是一名优秀的程序员,十分优秀!