ajax能拿到401axios无法拿到,解决axios.interceptors.response 401 403问题
在axios中爬过的坑
项目是后端采用的grails + spring cloud + gorm + es等插件做的, 前端采用的是element + axios + vue等,身份认证采用的是spring cloud oauth2.0 . 开发采用的是gradle搭建,语言使用的是groovy
在搭完框架后,正常流程postman都能跑的通,但是如果使用 axios就会遇到跨域问题
然后就解决吧 首先是preflight被禁的问题:
首先是webSecureAdapter这里
class WebSecure extends WebSecurityConfigurerAdapter{
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().requestMatchers(new RequestMatcher() {
@Override
boolean matches(HttpServletRequest request) {
return CorsUtils.isPreFlightRequest(request)
}
}).permitAll()
//.and()其他的内容
}
}
然后发现问题还是没解决 由于认证中心和资源在同一个项目上,暂时未拆分所以 ResourceServerConfigurerAdapter 这里也需要配置
class ResourceConf extends ResourceServerConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.requestMatchers(new RequestMatcher() {//preflght permitAll
@Override
boolean matches(HttpServletRequest request) {
return CorsUtils.isPreFlightRequest(request)
}
}).permitAll()
}
好了 ,到这里数据访问的跨域已经解决完成了
但是身份认证的时候也是要跨域的,而且我们的返回数据有部分内容是在header中的,这个在使用spring的框架时,会将其中的header替换掉,继续修改
找了半天,终于找到一个将spring Boot的Filter的修改
private CorsConfiguration buildConfig() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedOrigin("*"); // 1 设置访问源地址
corsConfiguration.addAllowedHeader("*"); // 2 设置访问源请求头
corsConfiguration.addAllowedMethod("GET"); // 3 设置访问源请求方法
corsConfiguration.addAllowedMethod("POST");
corsConfiguration.addAllowedMethod("DELETE");
corsConfiguration.addAllowedMethod("PUT");
corsConfiguration.addAllowedMethod("PATCH");
corsConfiguration.addExposedHeader("Content-Range")//这里是需要额外配置的header内容
return corsConfiguration;
}
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", buildConfig()); // 4 对接口配置跨域设置
return new CorsFilter(source);
}
好了,到这里好像已经全部配置完成了,数据能正常的访问,接口也都能正常的请求了,….
但是,在使用axios的时候,如果我们使用的token过期,或者token出错的时候,在浏览器能获取401 ,但是axios死活获取不到正常的返回码,找了一堆的源码,可以确定在axios中处理返回结果的位置
在axios 的lib/adapter/xhr.js中
request[loadEvent] = function handleLoad() {
if (!request || (request.readyState !== 4 && !xDomain)) {
return;
}
// The request errored out and we didn't get a response, this will be
// handled by onerror instead
// With one exception: request that using file: protocol, most browsers
// will return status as 0 even though it's a successful request
if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {
return;//注意这里,这里如果遇到上述的401/403等问题,直接返回,导致我们的axios不能取到返回码
}
// Prepare the response
var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;
var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response;
var response = {
data: responseData,
// IE sends 1223 instead of 204 (https://github.com/mzabriskie/axios/issues/201)
status: request.status === 1223 ? 204 : request.status,
statusText: request.status === 1223 ? 'No Content' : request.statusText,
headers: responseHeaders,
config: config,
request: request
};
settle(resolve, reject, response);
// Clean up request
request = null;
};
同时前端会报错 ,出现跨域问题, 再次整理后端代码,终于发现了WebSecurityConfigurerAdapter中
@Override
protected void configure(HttpSecurity http) throws Exception {
...
.csrf().disable();//这里同上面是相同的位置
}
这里的csrf被禁用后,如果使用跨域,就导致axios不能获取正常error.response
将这里修改为
http.authorizeRequests()
...
.and().cors()
好了 这时候,如果token超时或者使用不正确的token的时候 就能正常的返回error.response了
ajax能拿到401axios无法拿到,解决axios.interceptors.response 401 403问题相关推荐
- ajax的content-download时间过慢问题的解决与思考
ajax的content-download时间过慢问题的解决与思考 参考文章: (1)ajax的content-download时间过慢问题的解决与思考 (2)https://www.cnblogs. ...
- jQuery ajax 结合vue 获取豆瓣api 数据 ,jsonp解决跨域
jQuery ajax 结合vue 获取豆瓣api 数据 ,jsonp解决跨域 <!DOCTYPE html> <html><head><meta chars ...
- ajax请求时拒绝访问,ajax跨域请求js拒绝访问的解决方法
ajax跨域请求js拒绝访问的解决方法 内容精选 换一换 可能原因kubelet服务没有运行或运行异常.kubelet服务没有运行或运行异常.解决方法可以通过systemctl status kube ...
- ajax请求时提醒参数为空的解决办法
1.ajax请求时提醒参数为空的解决办法: 我们要把js对象用stringify转成json,然后再加上:contentType: "application/json" var _ ...
- 苹果ajax跨域,vue中解决axios跨域问题【ajax在vue中的应用】
兴冲冲的开始用vue封装组件.自定义指令之后,开始实战.诶,等等,貌似少了--ajax交互? 好吧大致研究了一下axios,但是存在以下两个问题: 1.跨域问题 2.数据格式问题 跨域信息示例: Fa ...
- ajax 没有权限 -quot;跨域quot;,如何解决AJAX中跨域访问出现'没有权限'的错误
如何解决AJAX中跨域访问出现'没有权限'的错误 很多人在使用AJAX调用别人站点内容的时候,JS会提示"没有权限"错误,这是XMLHTTP组件的限制-安全起见 禁止访问非同域的网 ...
- ajax提交后立刻刷新,Ajax提交表单页面刷新很快的解决方法
注:使用ajax 提交表单时 type类型最好不用submit 用button合适 function formCheck(){ $.ajax({ type: "post", url ...
- 【jquery】ajax 请求成功后新开窗口被拦截解决方法
问题: 前面开发项目时碰到一个问题,ajax 异步请求成功后需要新开窗口打开 url,使用的是 window.open() 方法,但是很可惜被浏览器给拦截了,怎么解决这个问题呢? 分析: 浏览器之所以 ...
- ajax请求提示html状态码302,快速解决ajax请求出错状态码为0的问题
今天在使用 ajax 向后台请求数据时出现错误,提示状态码为 0 ,后台采用的是 spring mvc 架构. 状态码为0是什么意思呢?查找了下,原来它意味着 (未初始化)即没有调用到send()方法 ...
最新文章
- 攻和防谁更厉害?AI技术在恶意软件检测中的应用和对抗
- php 如何利用 soap调用.Net的WebService asmx文件
- Factory - 工厂模式
- c语言中if—else的配对问题
- MISC-BUUCTF-9题-九连环-佛系青年等
- fcpx怎么合成延时摄影_延时摄影合成终极后期教程
- poj2516Minimum Cost
- eclipse启动不起来,eclipse.ini配置问题(支持大内存64bit问题)
- 支持向量机的基本思想_支持向量机理论详细推导
- 我的Android第二章
- JS读取client端的文件的代码片段
- 1043 Is It a Binary Search Tree (25 分) BST反转?不反转 遍历+vector
- 从exe程序反汇编得到py源码
- Latex 图像、表格标题(题注)加脚注
- Java Base64 加密与解密
- 已知直线方程,计算直线对应的向量
- shame on u
- SQL SERVER 软件和安装步骤
- CREATE TABLESPACE命令详解
- 10月各国最新签证及入境政策汇总
热门文章
- 【论文写作】毕业论文写作的基本流程
- 信号与系统考研复习例题详解_小语种日语日本文学复习考研资料加藤周一《日本文学史序说(上)》笔记和考研真题详解...
- 项目实体类报错_分享elasticserch在质检算法项目中的应用
- c语言do while语句用法6,c语言do while的用法
- 微服务_SpringCloud微服务架构实战:高并发微服务架构设计
- 产品研发过程管理专题——软件测试是提高软件产品质量的必要条件
- SSH关于公钥认证Permission denied的问题
- linux基本操作命令的使用
- bzoj千题计划174:bzoj1800: [Ahoi2009]fly 飞行棋
- 【echarts】 tooltip显示图片