请求地址中主动携带Cookies信息通过登录验证

一、背景

最近在做一个机关单位的项目,他们的项目基本都是部署在内部网络中,并且都做了单点登录验证,即就是该网站上挂载了许多的系统和应用,访问其中的某一个系统和应用的时候,都会被单点登录拦截在登录页面,必须登录该网站,才能访问其中的系统及应用

二、问题描述

该项目中使用了第三方插件,即在线 Office 插件,在线 Office 插件的原理无外乎也就是和浏览器兼容一个插件,在浏览器中通过该插件调取本地的 Office 软件,例如 WPS 等。代码如下:

// 初始化插件
var Application;
Application = init("yozo", "100%", $(window).height());
Application.ActionEnabledWithYozoID(4, false);
Application.openDocumentRemote(serverBaseUrl + '/file/getFileStream.action?id=${id}', false);
Application.enableProtect(true);
Application.setToolbarAllVisible(false);

以上是在 JSP 页面中打开在线 Office 插件的部分代码。我们可以看出,我们唯一给到这个插件的东西就是文件流的地址,我们的文档都是以二进制的方式保存在数据库的

当插件调取本地 Office 软件的时候,会将这个地址传给本地 Office 软件,那么传给它的仅仅是 API 地址而已,并没有 Cookies 信息,当调取这个 API 地址时,就会被前面我们说到的单点登录给拦截到,导致获取不到数据,打不开文档

jsessionid
可以看出,我们在页面正常访问项目的时候,每个请求都会自动携带一个 Cookies 信息,里面放入了 JSESSIONID,这是我们通过单点登录的唯一凭证

三、解决方案

既然本地 Office 软件在发起请求的时候没有带上 Cookies 信息,那么就只有我们手动给它传输 Cookies 信息了

  • 1、获取 JSESSIONID
<%String sessionId = request.getSession().getId();%>
  • 2、手动传输 Cookies 信息
Application.openDocumentRemote(serverBaseUrl + '/file/getFileStream.action;jsessionid=<%=sessionId%>?id=${id}', false);

这里尤为注意,不能将 jsessionid 跟在参数后面,这样服务器会把 jsessionid 作为参数处理,也是无法传输 Cookies 信息的

这样,我们就在请求地址中手动传入了 Cookies 信息,可以通过登录验证了

如您在阅读中发现不足,欢迎留言!!!

已标记关键词 清除标记
访问[https://passport2.chaoxing.com/fanyalogin](https://passport2.chaoxing.com/fanyalogin "") ,登录时提供一个JSESSIONID和route(之前访问,服务器在set-Cookiez返回的),登录成功之后并没有在set-Cookie见到JSESSIONID和route了, ![图片说明](https://img-ask.csdn.net/upload/202007/04/1593832848_96929.png) 但是浏览器马上继续访问网站时,JSESSIONID和route竟然莫名其妙更改了,不是 第一次登录成功时提供的JSESSIONID和route,而是另外一个数值,百思不得其解 ![图片说明](https://img-ask.csdn.net/upload/202007/04/1593832599_493713.png) 经过测试,后台验证是否登录成功是判断 JSESSIONID和route,缺一不可,JSESSIONID是如何对登录时提供的JSESSIONID加密的呢? 提供一个python代码,按正常的抓包登录成功之后,用session保持会话或者用提出cookie直接request访问,访问新网址应该可以正常得到数据,结果是提示:您还未登录 ``` s = requests.session() loginUrl = "https://passport2.chaoxing.com/fanyalogin" data={ 'fid':'-1', 'uname':'15216130517', 'password':'YXNkNTIw', 'refer':'http%3A%2F%2Foffice.chaoxing.com%2Ffront%2Fthird%2Fapps%2Freserve%2Funified%2Fcode%3Fid%3D501%26reserveId%3D501%26fidEnc%3D797928204c34e200%26enc%3Df866b3f33f20c1cfb85bd6021e85b11b%26indexEnc%3Dd8b3f90fb0364e3c8e43478f12899eff', 't':'true' } r = s.post(loginUrl, data) # 登录 print(r.json()) print(r.headers) print(s.cookies) orderUrl = "http://office.chaoxing.com/data/apps/reserve/submit/reserve" data={ 'itemId':'2469', 'reserveId':'501', 'date':'2020-07-06', 'startTime':'2020-07-06 07:30', 'endTime':'2020-07-06 22:00', 'remark':'', 'intervalIdStr':'104959' # 104964 } r=s.post(orderUrl,data) print(r.json()) ``` 再提供一下JS代码,并没有修改Jsessionid和route ``` $.ajax({ url: "/fanyalogin", type:"post", dataType : 'json', data:{ 'fid':fid,'uname':phone,'password':pwd,'refer':refer,'t':t}, success: function(data){ if(data.status){ if(data.tochaoxing){ window.location = "/towriteother?name="+encodeURIComponent(data.name)+"&pwd="+encodeURIComponent(data.pwd)+"&refer="+data.url; }else{ window.location = decodeURIComponent(data.url); } }else{ var msg = util.isEmpty(data.msg2) ? "登录失败" : data.msg2; msg = ("密码错误" == msg || "用户名或密码错误" == msg) ? "手机号或密码错误" : msg; util.showMsg(true,"err-txt",msg); } } }); ```
©️2020 CSDN 皮肤主题: 终极编程指南 设计师:CSDN官方博客 返回首页