#强智教务系统模拟登录
#java
闲着没事想做一个教务系统查询的功能,但是到了登录最后一步遇到一个cookie问题
先介绍一下过程
首先
进入登录页面时会收到一个响应过来的cookie
SERVERID=124; bzb_njw=7A0DED7174921F6C9C56255ED70AA99F
让后呢我正常登录系统,通过网络请求发现请求携带的数据如下
发现这个encode是根据在这个请求之前的一个有一个请求是根据请求携带回去的cookie在服务端生成一个类似密钥的东西然后响应回来的dataStr再做拼接,拼接成encode下面是我在页面源代码中找到的生成encode代码
然后嘞我把这个改造迁移到我的项目里,生成dataStr也是在我的java里响应过去的
@Override
public Result jwxt() throws IOException, UnirestException {
Unirest.setTimeouts(0, 0);
HttpResponse<String> response = Unirest.get("http://172.20.63.226:80/")
.header("Connection", "keep-alive")
.asString();
System.out.println(response.getHeaders()+"响应1");
Map<String, List<String>> headers = response.getHeaders();
List<String> cookieHeaders = headers.get("Set-Cookie");
if (cookieHeaders != null) {
for (String header : cookieHeaders) {
if (header.contains("bzb_njw")) {
// 解析bzb_njw的值
bzb_njw = header.split("=")[1].split(";")[0];
} else if (header.contains("SERVERID")) {
// 解析SERVERID的值
SERVERID = header.split("=")[1].split(";")[0];
}
}
}
//获取教务系统验证码
try {
Unirest.setTimeouts(0, 0);
HttpResponse<InputStream> response2 = Unirest.get("http://172.20.63.226:80/verifycode.servlet")
.header("Cookie", "bzb_njw="+bzb_njw+"; SERVERID="+SERVERID)
.header("Connection","keep-alive")
.asBinary();
System.out.println( response2.getHeaders()+"响应2");
// 将响应体转为Base64编码
byte[] buffer = new byte[1024];
int len;
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
while ((len = response2.getBody().read(buffer)) != -1) {
outputStream.write(buffer, 0, len);
}
String image = Base64.getEncoder().encodeToString(outputStream.toByteArray());
String dataStr = beforLogin();
return Result.success(dataStr,image);
} catch (UnirestException | IOException e) {
throw new RuntimeException(e);
}
}
@Override
public Result login(JwxtLogin jwxtLogin) throws UnirestException {
this.userAccount = jwxtLogin.getUserAccount();
this.userPassword = jwxtLogin.getUserPassword();
this.encoded = jwxtLogin.getEncoded();
this.imageToken = jwxtLogin.getImageToken();
Unirest.setTimeouts(0, 0);
HttpResponse<String> response = Unirest.post("http://172.20.63.226:80/Logon.do?method=logon")
.header("Cookie", "SERVERID=" + SERVERID + "; bzb_njw=" + bzb_njw)
.header("Connection","keep-alive")
.field("userAccount", userAccount)
.field("userPassword", "")
.field("RANDOMCODE", imageToken)
.field("encoded", encoded)
.asString();
System.out.println(response.getHeaders()+"响应3");
Map<String, List<String>> headers = response.getHeaders();
List<String> locationHeaders = headers.get("Location");
if (locationHeaders != null && !locationHeaders.isEmpty()) {
Location = locationHeaders.get(0);
System.out.println(Location+"loca");
}
System.out.println(SERVERID+"***************");
return Result.success(Location, new Cookie(bzb_njw,SERVERID,null));
}
@Override
public Result getCookie(Cookie cookie) {
stringRedisTemplate.opsForValue().set("bzb_jsxsd",cookie.getBzb_jsxsd());
return Result.success();
}
public String beforLogin() {
try {
Unirest.setTimeouts(0, 0);
HttpResponse<String> response = Unirest.post("http://172.20.63.226:80/Logon.do?method=logon&flag=sess")
.header("Connection","keep-alive")
.header("Cookie", "SERVERID=" + SERVERID + "; bzb_njw=" + bzb_njw)
.asString();
int status = response.getStatus();
String body = response.getBody();
System.out.println("123Code: " + status);
System.out.println("123oken: " + body);
token = body;
// 获取 cookie
System.out.println(response.getHeaders()+"响应5");
String cookie = response.getHeaders().getFirst("SERVERID");
System.out.println("Cookie: " + cookie);
return body;
} catch (UnirestException e) {
throw new RuntimeException(e);
}
}
}
我的前端如下
大概就是我访问我的页面时会我的后端会帮我把首次访问教务系统带来的cookie储存起来然后进行后面的操作比如我的后端请求http://172.20.63.226/Logon.do?method=logon&flag=sess%E5%B8%A6%E6%9D%A5%E7%9A%84%E5%AF%86%E9%92%A5%E4%BC%9A%E8%BF%94%E5%9B%9E%E5%89%8D%E7%AB%AF,%E4%B9%9F%E4%BC%9A%E6%8A%8A%E9%AA%8C%E8%AF%81%E7%A0%81%E5%9B%BE%E7%89%87%E4%BB%A5base64%E5%BD%A2%E5%BC%8F%E5%8F%8D%E9%A6%88%E7%BB%99%E5%89%8D%E7%AB%AF%EF%BC%8C%E7%84%B6%E5%90%8E%E5%89%8D%E7%AB%AF%E5%86%8D%E5%81%9A%E6%8B%BC%E6%8E%A5%E6%88%90encode%E5%86%8D%E8%BF%9B%E8%A1%8Clogin,%E7%84%B6%E5%90%8E%E6%8E%A5%E4%B8%8B%E6%9D%A5%E9%81%87%E5%88%B0%E4%BA%86%E4%B8%80%E4%B8%AA%E5%A4%B4%E7%96%BC%E7%9A%84%E9%97%AE%E9%A2%98%EF%BC%8C%E5%B0%B1%E6%98%AF%E7%99%BB%E5%BD%95%E6%97%B6%E7%9A%84%E9%82%A3%E4%B8%AA%E8%AF%B7%E6%B1%82%EF%BC%8C%E5%BE%80%E4%B8%8B%E7%9C%8B
我后端携带数据请求
http://172.20.63.226/Logon.do?method=logon
也就是下面正常登录的请求
发现重定向访问了那个很长的地址,在很长这个请求才会返回给我最终的有权限的cookie如下图
并且以后的查课查成绩都会用到bzb_njw,bzb_jsxsd,SERVERID这三个cookie可是我后端就是拿不到最终的bzb_jsxsd,在后端访问是拿不到cookie的只有在浏览器直接访问那个长长的请求才能拿到,哎,有没有办法解决这个问题,我试了很多方法还是不能在我的登录页面实现获取最终的那个cookie,有没有人给点思路,多谢了