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

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信息)