javascript:使用XMLHttpRequest登录到网站

javascript:使用XMLHttpRequest登录到网站,javascript,authentication,cookies,login,xmlhttprequest,Javascript,Authentication,Cookies,Login,Xmlhttprequest,我正试图在javascript中编写一个代码,使我能够登录到一个网站。 当我第一次发送http(get请求)以获取登录网页时,网站会正确响应我的请求,这会给我一个cookie(在登录之前)。 现在我想在另一个POST请求中发送用户名和密码以及cookie,以获得登录身份验证。 问题是,当im发送该请求时,与网页源代码发送的请求相同,它将引发错误(xhr.status为0)。 那可能有什么问题 这是我的密码: var url = "https://sess.shirazu.ac.ir/sess/S

我正试图在
javascript
中编写一个代码,使我能够登录到一个网站。 当我第一次发送http(get请求)以获取登录网页时,网站会正确响应我的请求,这会给我一个cookie(在登录之前)。 现在我想在另一个
POST
请求中发送用户名和密码以及cookie,以获得
登录
身份验证。 问题是,当im发送该请求时,与网页源代码发送的请求相同,它将引发错误(
xhr.status
为0)。 那可能有什么问题

这是我的密码:

var url = "https://sess.shirazu.ac.ir/sess/Start.aspx";
var username = "myUsername";
var password = "myPassword";
var xhr;
login: function(){


      xhr = new XMLHttpRequest();
      xhr.withCredentials = true;
      xhr.onreadystatechange = (e) => { 
          if (xhr.readyState !== 4) {
            return;
          }

          if (xhr.status === 200) {

            var pageSource =  xhr.responseText; //gets the response of the request of the login page
//here is where im hashing the password with the given key in the retrieved page-source
            var parser = new DOMParser();
            var doc = parser.parseFromString(pageSource, "text/xml");   
            var RKeyElement = String(doc.getElementById("_RKey"));
            var RKey = RKeyElement.substring(RKeyElement.search("value"));  
            RKey = RKey.substring(RKey.search("\"")+1, RKey.lastIndexOf("\"")); //getting the 32-digit-long _RKey

            DoLogin(username, password , '', RKey);
          }
          else {
            Alert.alert("error");
          }
        };

      xhr.open('GET', url, true);
      xhr.send(null);

  },
}
上面的代码运行良好。问题在于此DoLogin()函数:

function DoLogin(iId, iPass, iCode, RKey) {
    var Inc = Md5High(RKey, iPass);    //this works fine (Hashing the password)
    var Request = xhr;
    Request.onreadystatechange = (e) => {
      if (Request.readyState !== 4) {
        return;
      }

      if (Request.status === 200) {
        console.log('success', Request.responseText);
      }
      else {
        console.log('error');   //status is 0 when this occures
      }
    };

  Request.abort();

  Request.open('post', "https://sess.shirazu.ac.ir/sess/17610358812"+"/sess/Script/AjaxEnvironment.aspx?Act=MakeMember&Id=" + iId + "&Pass=" + Inc + "&Code=" + iCode, true);
  Request.send();
}

我不能用
POST
方法解决这个问题。但是我发现只要请求的内容是空的,使用
POST
GET
方法就没有什么区别。因此,解决我的问题的方法是将第二个函数中的
POST
方法替换为
GET
,它确实工作得很好。

我建议不要使用
GET
,因为这样会允许密码显示在服务器日志中。