uni-app cas身份认证集成多个系统时 post请求第一次会丢失参数

uni-app cas身份认证集成多个系统时 post请求第一次会丢失参数

开发环境 版本号 项目创建方式
Windows win10 HBuilderX

产品分类:uniapp/App

PC开发环境操作系统:Windows

PC开发环境操作系统版本号:win10

HBuilderX类型:正式

HBuilderX版本号:3.2.16

手机系统:Android

手机系统版本号:Android 11

手机厂商:华为

手机机型:mate30

页面类型:vue

vue版本:vue2

打包方式:云端

操作步骤:

cas身份认证成功后,uni.request请求资源使用post传参时,因cas子系统进行验证时中间有个302再请求,因302后将参数丢失,造成请求异常。 第二次请求时正常。 使用get请求时第一302后因不丢参数也正常。


预期结果:

302后不要丢失参数。将参数重新提交。

实际结果:

302后丢失参数. 此现象当前所有版本都存在。


bug描述:

我们使用cas做为身份认证,里面集成多们子系统。在平台登录后.
问题:第一次访问某个子系统post请求数据时,会出现302重定向的过程,会将post的参数丢失,造成第一次请求失败,第二次请求时因重定向时做了身份认证。请求正常。
使用get提交参数时第一次正常。
看能否升级okhttp请求,不要将post参数丢了。

同时解决时注意一下https定重向http或http重定向https
处理建议参考:https://www.jianshu.com/p/61a60859a317

更多关于uni-app cas身份认证集成多个系统时 post请求第一次会丢失参数的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

好 我先看看哈

更多关于uni-app cas身份认证集成多个系统时 post请求第一次会丢失参数的实战教程也可以访问 https://www.itying.com/category-93-b0.html


那你试试你们的服务器能否直接返回 307呢

这是一个典型的HTTP 302重定向导致POST请求参数丢失的问题。在uni-app的uni.request中,当遇到302状态码时,默认行为会跟随重定向,但对于POST请求,重定向后的新请求会变为GET请求(根据HTTP/1.1规范),导致参数丢失。

问题分析:

  1. CAS认证流程中,首次访问子系统时触发302重定向到认证中心
  2. uni-app底层网络库(Android端为okhttp)在处理302时,默认将POST转为GET
  3. 第二次请求因已认证,不再重定向,因此正常

解决方案:

方案一:服务端优化(推荐)

  • 让CAS服务端在认证成功后返回200状态码而非302
  • 通过响应体返回重定向URL,由前端控制跳转
  • 避免HTTP层面的重定向导致请求方法改变

方案二:前端拦截处理 在uni.request的拦截器中检测302响应,手动处理:

uni.addInterceptor('request', {
  invoke(args) {
    // 存储原始请求参数
    args._originalData = args.data
    args._originalMethod = args.method
  },
  success(res) {
    if (res.statusCode === 302) {
      // 获取重定向URL
      const redirectUrl = res.header.Location || res.header.location
      if (redirectUrl && args._originalMethod === 'POST') {
        // 使用原始参数重新发起POST请求
        return uni.request({
          url: redirectUrl,
          method: 'POST',
          data: args._originalData,
          header: args.header
        })
      }
    }
  }
})
回到顶部