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"));