账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    传统表单模拟点击提交成功,但Ajax报跨域错误
    54
    0

    前言

    填信息的登录页面在本地,自己做的;认证的页面不是我的,在不可控的服务器上

    传统表单提交

    main.html

    <form name="form1" id="form1" method="post" action="url">
        <input name="act" type="text" placeholder="账号" >
        <input name="pwd" type="password" placeholder="密码">
        <input id="submit" type="submit">
    </form>

    clicksm.js

    $('#submit').click()

    填好表单,对submit按钮用click()模拟点击,可以跳转到action的url,认证成功.

    Ajax提交

    ajaxsm.js

    $.ajax({
        type: 'POST',
        url: "url",
        data:$('#form1').serialize(),
        success: function (res) {
            alert("success!");
        }
    });

    用谷歌浏览器看控制台会报错,提示跨域,认证失败
    ps:jsonp无效

    php+curl 提交

    通过php的curl,以POST方式发送带登录信息和伪造referer字段的包,能认证成功

    问题

    同样是在js里,为什么能直接模拟提交按钮点击进行表单提交,却不能用ajax的方式来提交?
    就只是因为跨域吗?那这个本地登录页也不同域,模拟按钮却能提交?网上谷歌百度无解,求高人点拨明辨!

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 米醋诗人 普通会员 1楼

      在传统的表单提交中,浏览器会通过XMLHttpRequest对象来发送POST请求。当发送请求时,需要提供URL、请求体、是否异步等信息。如果URL不在同源的范围内,或者HTTP请求头中没有指定同源策略,就会出现跨域错误。

      例如,如果你的网站在开发时配置了CORS(跨域资源共享),但是Ajax请求的URL不在这个范围内,就会出现跨域错误。

      解决这个问题的方法有以下几种:

      1. 使用CORS:你需要在服务器端设置允许特定的域名进行跨域访问。这可以通过在Access-Control-Allow-Origin字段中设置你需要的域名来实现。

      2. 使用JSONP:JSONP(JSON with Padding)是一种解决跨域问题的方法。JSONP通过在请求的URL中添加一个回调函数的名称来实现跨域。然后,服务器端会创建一个函数,这个函数会在客户端被调用,而这个函数并不知道服务器端的真实URL。

      3. 使用XMLHttpRequest with CORS:这是一种更简单的解决方案,只需要在发送请求时提供XMLHttpRequest对象,并且在请求头中设置允许特定的域名进行跨域访问。

      以下是一个使用XMLHttpRequest with CORS的示例:

      javascript var xhr = new XMLHttpRequest(); xhr.open("POST", "https://example.com/api/data", true); xhr.setRequestHeader("Content-Type", "application/json"); xhr.onload = function() { if (xhr.status === 200) { console.log(xhr.responseText); } }; xhr.send(JSON.stringify({name: "John", age: 30}));

      在这个示例中,我们首先创建了一个新的XMLHttpRequest对象,并设置了请求方法、请求头和是否异步等信息。然后,我们设置了请求体为JSON格式,并在请求完成时调用onload函数。最后,我们发送了一个POST请求,并在请求完成时打印了返回的数据。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部