杨_哈哈哈
杨_哈哈哈
  • 发布:2020-11-05 15:39
  • 更新:2020-11-11 15:34
  • 阅读:979

【报Bug】ajax请求后台两个页面请求时请求头里session不同,shiro无法认证

分类:HTML5+

产品分类: HTML5+

HBuilderX版本号: 2.9.3

手机系统: Android

手机系统版本号: Android 9.0

手机厂商: 华为

手机机型: p10

打包方式: 云端

操作步骤:

登录的Ajax请求

$.ajax(owner.getServerUrl()+'/get_login.action',{  
            data:{  
                logincode:owner.encrypt(loginInfo.account),  
                password:owner.encrypt(loginInfo.password),  
                clientid:owner.encrypt(loginInfo.clientid),  
                key:owner.mQUN1  
            },  
            dataType:'text',   
            type:'post',   
            timeout:10000,//超时时间设置为10秒;  
             xhrFields: {  
                    withCredentials: true  
                },  
            success:function(data,xhr){  
                if(data.indexOf("success")>-1){  
                    //owner.setCookie("meta.session.id="+data.split("@")[1])  
                    return owner.createState(loginInfo, callback);  
                }  
                 else{  
                    return callback('用户名或密码错误');  
                }  
            },  
            error:function(xhr,type,errorThrown){  
                return callback('返回超时');  
            }  
        });  
    };  

登录成功后

 $.openWindow({  
                                url:"pages/main/main.html",   // 新页面的url  
                                id:"main",     // 新页面的id标识  
                            });  

页面加载完成后

$.ajax({  
                    type:'post',  
                    url:serverurl+'/appHeartJump.action',  
                    dataType:'text',  
                    async:false,  
                    xhrFields:{  
                        withCredentials:true  
                    },  

                    success:function(data){  
                        console.log(data);  
                        if(data=="ok"){  
                            f2=true;  
                        }else{  
                            f2=false;  
                        }  
                    },  
                       error: function (XMLHttpRequest, textStatus, errorThrown) {  
                           console.log("ERROR");  
                           f2=false  
                        }  
                });  

预期结果:

后台根据session获取到当前用户

实际结果:

由于session不同被shiro拦截

bug描述:

app端登录,登录成功后第二个界面再次访问后台,请求头中cookie里的sessionid跟第一次不一样,就被1.6+版本的shiro拦截,导致无法访问。

2020-11-05 15:39 负责人:DCloud_Android_DQQ 分享
已邀请:
DCloud_Android_DQQ

DCloud_Android_DQQ

收到,我尝试复现一下

DCloud_Android_DQQ

DCloud_Android_DQQ

5+中的网络请求有两种。
一种是5+ sdk功能
https://www.html5plus.org/doc/zh_cn/xhr.html

另外一种 是你这里使用的ajax请求。
这种请求的实现 是 浏览器内核,不是我们提供的api。
而且你使用的这种方式在不同手机,rom上是不能保证兼容性的。建议切换成5+的api

  • 杨_哈哈哈 (作者)

    修改后代码

    var xhr=new plus.net.XMLHttpRequest();

    xhr.open( "POST", owner.getServerUrl()+'/get_login.action' );

    var data={

    logincode:owner.encrypt(loginInfo.account),

    password:owner.encrypt(loginInfo.password),

    clientid:owner.encrypt(loginInfo.clientid),

    key:owner.mQUN1

    };

    xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8");

    xhr.send($.param(data));

    xhr.timeout=10000;

    xhr.onload=function(e){///请求成功

    if(this.responseText=="success"){

    return owner.createState(loginInfo, callback);

    }else{

    return callback('用户名或密码错误');

    }

    }


    =======================分割线===================================================

    var xhr=new plus.net.XMLHttpRequest()

    var data={

    };

    xhr.open( "POST", serverurl+'/appHeartJump.action');

    xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=utf-8");

    xhr.send($.param(data));

    xhr.onload=function(e){///请求成功

    console.log(this.responseText)

    }

    ==================================分割线===============================

    后台打印结果

    两次请求的session依旧不同

    2020-11-08 11:03

DCloud_Android_DQQ

DCloud_Android_DQQ

客观的分析一下这个问题:
1 同时使用浏览器的 ajax和 5+的网络请求,发现session都有问题。 大概率是你们自己服务器session 问题。

从快速解决问题的角度,你可以用标准的浏览器试一下,是否也是有同样的问题。

2 你可以把真实的请求地址发出来。 如果隐私,也可以私发给我。我可以尝试帮你debug一下。

  • 杨_哈哈哈 (作者)

    用Chrome浏览器是正常的,没有出现同样问题

    2020-11-10 08:47

  • DCloud_Android_DQQ

    回复 杨_哈哈哈: 你发一下真实的url地址和 参数 我这边做一下测试。 如果有安全顾虑可以私发我

    2020-11-10 17:58

DCloud_Android_DQQ

DCloud_Android_DQQ

你好 我确认了一下 5+ 的cookie 不会自动处理。 需要手动处理

uniapp的 cookie和基于cookie机制的session是 可以自动处理的

该问题目前已经被锁定, 无法添加新回复