Ajax跨域請求,無法傳遞及接收cookie信息(應(yīng)用于系統(tǒng)登錄認(rèn)證及退出)解決方案
1、項(xiàng)目環(huán)境:前端應(yīng)用HTML,js,jQuery ajax請求,部署在nginx服務(wù)器;后端業(yè)務(wù)系統(tǒng)應(yīng)用spring mvc,mybatis,部署在Apache服務(wù)器。
2、問題描述:系統(tǒng)權(quán)限安全框架使用shiro,系統(tǒng)登錄時發(fā)送ajax請求調(diào)用springmvc action方法進(jìn)行系統(tǒng)登錄及身份認(rèn)證,角色權(quán)限授權(quán)等。由于ajax請求時,瀏覽器會認(rèn)為攜帶Cookie是不安全請求,將限制其攜帶Cookie信息,導(dǎo)致登錄action方法無法獲取并響應(yīng)相應(yīng)的Cookie(JSESSIONID),身份認(rèn)證及角色權(quán)限授權(quán)、退出等都操作都無法正常使用。
3、解決方案:在ajax里添加withCredentials的配置,允許其請求攜帶cookie信息。通過設(shè)置withCredentials=true,發(fā)送Ajax時,Request header中便會帶上 Cookie 信息。
前端代碼:
$.ajaxSetup({
type: "post",
async:false,
timeout: 15000,
dataType: 'json',
xhrFields: {
withCredentials: true // 要在這里設(shè)置 跨域設(shè)置cookie
},
success: function (data) {
},
error: function (xhr, status, e) {
},
complete: function (xhr, status) {
},
beforeSend: function (xhr) {
xhr.withCredentials = true;//此處設(shè)置無效
},
}) ;
Java后端代碼:
//服務(wù)器端要通過在響應(yīng) header 中設(shè)置Access-Control-Allow-Credentials = true來運(yùn)行客戶端攜帶證書式的訪問。
//通過對Credentials參數(shù)的設(shè)置,就可以保持跨域Ajax時傳遞的Cookie。
response.setHeader("Access-Control-Allow-Credentials", "true");
//我們重新設(shè)置Access-Control-Allow-Origin的值;
//當(dāng)服務(wù)器端接收到請求后,在返回響應(yīng)時,把請求的域Origin填寫到響應(yīng)的Header信息里(即誰訪問我,我允許誰)
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));