现象
- ajax接口请求,后端拦截器中验证token有效性,失效则response.redirect(“http://other-domain/xx"),结果前端页面显示跨域报错
- 通过浏览器输入跨域跳转页面,成功
原因
- 当浏览器请求一个地址,服务端返回302,浏览器会再次请求一次要重定向的url地址(页面直接请求的响应的重定向地址,当前页面是要跳转的)。
- 如果用ajax发起一次请求(ajax发起的重定向,当前页面不会跳转),服务端返回302,重定向后url的域名跟ajax请求的域名相同,浏览器会再次请求重定向的url请求,请求成功会调用ajax的success函数,如果重定向url地址域名跟ajax请求的域名不同(跨域重定向),浏览器识别响应的response的Location跨域了请求就会被阻止,失败调用error方法。
解决方案
- 方案1 :因为是拦截器拦截所有接口,让前端修改所有接口为jsonp不现实,所以前端不做这块的修改
- 方案2:后端不做重定向跳转,设置response.status状态,约定好协议,让前端进行页面跳转。
- 在本项目中直接使用此方案还是失败,原因是首次是重定向status=301,无法判断接口权限是否失效,重定向后的地址才是真正返回911失效状态。但重定向的地址请求,是浏览器发起的,前端捕获不到,所以无法判断;
- 解决方案:重定向前,设置业务属性到response中,用此属性判断达到跳转;
- 方案3 :nginx负责跳转。此方案由于个别系统是jsp页面,先加载页面,待页面初始化后才能接口请求,但由于页面路径请求就被拦截直接跳转了无法触发接口,继而前端无法捕获接口返回响应,导致方案2不可行。
- 方案4:还没有试过,可以先试下
response.setHeader( "Access-Control-Allow-Origin","*" );