在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问题相关推荐

  1. ajax的content-download时间过慢问题的解决与思考

    ajax的content-download时间过慢问题的解决与思考 参考文章: (1)ajax的content-download时间过慢问题的解决与思考 (2)https://www.cnblogs. ...

  2. jQuery ajax 结合vue 获取豆瓣api 数据 ,jsonp解决跨域

    jQuery ajax 结合vue 获取豆瓣api 数据 ,jsonp解决跨域 <!DOCTYPE html> <html><head><meta chars ...

  3. ajax请求时拒绝访问,ajax跨域请求js拒绝访问的解决方法

    ajax跨域请求js拒绝访问的解决方法 内容精选 换一换 可能原因kubelet服务没有运行或运行异常.kubelet服务没有运行或运行异常.解决方法可以通过systemctl status kube ...

  4. ajax请求时提醒参数为空的解决办法

    1.ajax请求时提醒参数为空的解决办法: 我们要把js对象用stringify转成json,然后再加上:contentType: "application/json" var _ ...

  5. 苹果ajax跨域,vue中解决axios跨域问题【ajax在vue中的应用】

    兴冲冲的开始用vue封装组件.自定义指令之后,开始实战.诶,等等,貌似少了--ajax交互? 好吧大致研究了一下axios,但是存在以下两个问题: 1.跨域问题 2.数据格式问题 跨域信息示例: Fa ...

  6. ajax 没有权限 -quot;跨域quot;,如何解决AJAX中跨域访问出现'没有权限'的错误

    如何解决AJAX中跨域访问出现'没有权限'的错误 很多人在使用AJAX调用别人站点内容的时候,JS会提示"没有权限"错误,这是XMLHTTP组件的限制-安全起见 禁止访问非同域的网 ...

  7. ajax提交后立刻刷新,Ajax提交表单页面刷新很快的解决方法

    注:使用ajax 提交表单时 type类型最好不用submit 用button合适 function formCheck(){ $.ajax({ type: "post", url ...

  8. 【jquery】ajax 请求成功后新开窗口被拦截解决方法

    问题: 前面开发项目时碰到一个问题,ajax 异步请求成功后需要新开窗口打开 url,使用的是 window.open() 方法,但是很可惜被浏览器给拦截了,怎么解决这个问题呢? 分析: 浏览器之所以 ...

  9. ajax请求提示html状态码302,快速解决ajax请求出错状态码为0的问题

    今天在使用 ajax 向后台请求数据时出现错误,提示状态码为 0 ,后台采用的是 spring mvc 架构. 状态码为0是什么意思呢?查找了下,原来它意味着 (未初始化)即没有调用到send()方法 ...

最新文章

  1. 攻和防谁更厉害?AI技术在恶意软件检测中的应用和对抗
  2. php 如何利用 soap调用.Net的WebService asmx文件
  3. Factory - 工厂模式
  4. c语言中if—else的配对问题
  5. MISC-BUUCTF-9题-九连环-佛系青年等
  6. fcpx怎么合成延时摄影_延时摄影合成终极后期教程
  7. poj2516Minimum Cost
  8. eclipse启动不起来,eclipse.ini配置问题(支持大内存64bit问题)
  9. 支持向量机的基本思想_支持向量机理论详细推导
  10. 我的Android第二章
  11. JS读取client端的文件的代码片段
  12. 1043 Is It a Binary Search Tree (25 分) BST反转?不反转 遍历+vector
  13. 从exe程序反汇编得到py源码
  14. Latex 图像、表格标题(题注)加脚注
  15. Java Base64 加密与解密
  16. 已知直线方程,计算直线对应的向量
  17. shame on u
  18. SQL SERVER 软件和安装步骤
  19. CREATE TABLESPACE命令详解
  20. 10月各国最新签证及入境政策汇总

热门文章

  1. 【论文写作】毕业论文写作的基本流程
  2. 信号与系统考研复习例题详解_小语种日语日本文学复习考研资料加藤周一《日本文学史序说(上)》笔记和考研真题详解...
  3. 项目实体类报错_分享elasticserch在质检算法项目中的应用
  4. c语言do while语句用法6,c语言do while的用法
  5. 微服务_SpringCloud微服务架构实战:高并发微服务架构设计
  6. 产品研发过程管理专题——软件测试是提高软件产品质量的必要条件
  7. SSH关于公钥认证Permission denied的问题
  8. linux基本操作命令的使用
  9. bzoj千题计划174:bzoj1800: [Ahoi2009]fly 飞行棋
  10. 【echarts】 tooltip显示图片