使用Java进行网站获取数据时经常需要携带登陆的 Cookie 信息,然而 Cookie 是有时效性的,所以经常碰到 Cookie 失效的情况。
以下即为 Cookie 失效后自动重新获取的方式
需要的依赖:
本文将示例如何使用 HttpClient 模拟登陆Cloudrea Manager集群平台并获取其登录的 Cookie 信息。
pom.xml 文件中引入 HttpClient 依赖包(若其他依赖包含有此依赖,则无需引入):
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.10</version>
</dependency>
获取 Cookie 并将其设置http://192.168.50.57:7180/cmf/command/3897/details.json的请求头
完整代码如下:
package com.bjdv.yfzx.tenement.controller.clusterManager;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.httpclient.Cookie;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.cookie.CookiePolicy;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.springframework.web.bind.annotation.*;
@RestController
public class HttpLogin {
@PostMapping("/getDetail")
public static String getDetail(@RequestBody String idInfo) {
// 登陆 Url
String loginUrl = "http://192.168.50.57:7180/j_spring_security_check";
// 需登陆后访问的 Url
JSONObject jsonObject = JSONObject.parseObject(idInfo);
String id = jsonObject.getString("id");
String detailUrl = "http://192.168.50.57:7180/cmf/command/"+id+"/details.json";
HttpClient httpClient = new HttpClient();
// 模拟登陆,按实际服务器端要求选用 Post 或 Get 请求方式
PostMethod postMethod = new PostMethod(loginUrl);
// 设置登陆时要求的信息,用户名和密码
NameValuePair[] data = { new NameValuePair("j_username", "admin"), new NameValuePair("j_password", "admin") };
postMethod.setRequestBody(data);
try {
// 设置 HttpClient 接收 Cookie,用与浏览器一样的策略
httpClient.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
int statusCode=httpClient.executeMethod(postMethod);
// 获得登陆后的 Cookie
Cookie[] cookies = httpClient.getState().getCookies();
StringBuffer tmpcookies = new StringBuffer();
for (Cookie c : cookies) {
tmpcookies.append(c.toString() + ";");
System.out.println("cookies = "+c.toString());
}
if(statusCode==302){//重定向到新的URL
System.out.println("模拟登录成功");
// 进行登陆后的操作
GetMethod getMethod1 = new GetMethod(detailUrl);
// 每次访问需授权的网址时需带上前面的 cookie 作为通行证
getMethod1.setRequestHeader("cookie", tmpcookies.toString());
httpClient.executeMethod(getMethod1);
// 打印出返回数据,检验一下是否成功
String text = getMethod1.getResponseBodyAsString();
System.out.println(text);
return text;
}
else {
System.out.println("登录失败");
}
}
catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
通过postman测试,能正常返回json数据
注意:
cloudrea 前端页面展示的登录接口:http://192.168.50.57:7180/cmf/login
通过控制台的network可以看出,实际的登录接口是http://192.168.50.57:7180/j_spring_security_check,找到正确的登录接口,设置好请求方式和网站对应的账号密码使用上述代码就能够正常访问网站上的数据。
参考地址:https://www.cnblogs.com/zhimingxin/p/8473883.html