美文网首页
jQuery ajax跨域请求,无法传递及接收cookie信息

jQuery ajax跨域请求,无法传递及接收cookie信息

作者: QM | 来源:发表于2017-09-30 14:47 被阅读0次

    Ajax跨域请求,无法传递及接收cookie信息(应用于系统登录认证及退出)解决方案

    1、项目环境:前端应用HTML,js,jQuery ajax请求,部署在nginx服务器;后端业务系统应用spring mvc,mybatis,部署在Apache服务器。

    2、问题描述:系统权限安全框架使用shiro,系统登录时发送ajax请求调用springmvc action方法进行系统登录及身份认证,角色权限授权等。由于ajax请求时,浏览器会认为携带Cookie是不安全请求,将限制其携带Cookie信息,导致登录action方法无法获取并响应相应的Cookie(JSESSIONID),身份认证及角色权限授权、退出等都操作都无法正常使用。

    3、解决方案:在ajax里添加withCredentials的配置,允许其请求携带cookie信息。通过设置withCredentials=true,发送Ajax时,Request header中便会带上 Cookie 信息。

    前端代码:

    $.ajaxSetup({
                type: "post",
                async:false,
                timeout: 15000,
                dataType: 'json',
                xhrFields: {
                    withCredentials: true    // 要在这里设置 跨域设置cookie
                },
                success: function (data) {
                },
                error: function (xhr, status, e) {
                },
                complete: function (xhr, status) {
                },
                beforeSend: function (xhr) {
                     xhr.withCredentials = true;//此处设置无效
                },
    
            })  ;
    

    Java后端代码:

    //服务器端要通过在响应 header 中设置Access-Control-Allow-Credentials = true来运行客户端携带证书式的访问。
    //通过对Credentials参数的设置,就可以保持跨域Ajax时传递的Cookie。
    
    response.setHeader("Access-Control-Allow-Credentials", "true");
    
    //我们重新设置Access-Control-Allow-Origin的值;
    //当服务器端接收到请求后,在返回响应时,把请求的域Origin填写到响应的Header信息里(即谁访问我,我允许谁)
    
    response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
    
    

    相关文章

      网友评论

          本文标题:jQuery ajax跨域请求,无法传递及接收cookie信息

          本文链接:https://www.haomeiwen.com/subject/jkngextx.html