Axiso解决跨域访问(...XMLHttpRequest cannot load http:xxx.xxx No 'Access-Control-Allow-Origin'...)...

it2026-10-05  1

直接访问如下:this.$axios.get("http://localhost:8089/yc/demo").then(res=>{    console.log(res)}).catch(err=>{    console.log(err)})当运行程序后,控制台报错如下:...XMLHttpRequest cannot load http://xxx.xxx No 'Access-Control-Allow-Origin'...跨域访问错误:可以看到浏览器拦截了请求,因为跨域了,下面解决跨域问题。前端的修改:Step1:配置BaseUrl在main.js中,配置下访问的Url前缀:import Vue from 'vue'import App from './App'import Axios from 'axios'Vue.prototype.$axios = AxiosAxios.defaults.baseURL = '/api'Axios.defaults.headers.post['Content-Type'] = 'application/json';Vue.config.productionTip = false/* eslint-disable no-new */new Vue({  el: '#app',  components: { App },  template: '<App/>'})关键代码是:Axios.defaults.baseURL = '/api',这样每次发送请求都会带一个/api的前缀。Step2:配置代理修改config文件夹下的index.js文件,在proxyTable中加上如下代码:'/api':{    target: "http://localhost:8089/yc",    changeOrigin:true,    pathRewrite:{        '^/api':''    }}Step3:修改请求Url修改刚刚的axios请求,把url修改如下:this.$axios.get("/demo").then(res=>{    console.log(res)}).catch(err=>{    console.log(err)})Step4:重启服务重启服务后,此时已经能够访问了原理:因为我们给url加上了前缀/api,我们访问/demo就当于访问了:localhost:8080/api/demo(其中localhost:8080是默认的IP和端口)。在index.js中的proxyTable中拦截了/api,并把/api及其前面的所有替换成了target中的内容,因此实际访问Url是http://localhost:8089/yc/demo。后端的修改:import javax.servlet.*;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;public class CorsFilter implements Filter {    @Override    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {        HttpServletResponse response = (HttpServletResponse) res;        HttpServletRequest request = (HttpServletRequest) req;        // 不使用*,自动适配跨域域名,避免携带Cookie时失效        String origin = request.getHeader("Origin");        if(StringUtils.isNotBlank(origin)) {            response.setHeader("Access-Control-Allow-Origin", origin);        }        // 自适应所有自定义头        String headers = request.getHeader("Access-Control-Request-Headers");        if(StringUtils.isNotBlank(headers)) {            response.setHeader("Access-Control-Allow-Headers", headers);            response.setHeader("Access-Control-Expose-Headers", headers);        }        // 允许跨域的请求方法类型        response.setHeader("Access-Control-Allow-Methods", "*");        // 预检命令(OPTIONS)缓存时间,单位:秒        response.setHeader("Access-Control-Max-Age", "3600");        // 明确许可客户端发送Cookie,不允许删除字段即可        response.setHeader("Access-Control-Allow-Credentials", "true");                chain.doFilter(request, response);    }    @Override    public void init(FilterConfig filterConfig) {    }    @Override    public void destroy() {    }    /*    注册过滤器:    @Bean    public FilterRegistrationBean registerFilter() {        FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<>();        bean.addUrlPatterns("/*");        bean.setFilter(new CorsFilter());        // 过滤顺序,从小到大依次过滤        bean.setOrder(Ordered.HIGHEST_PRECEDENCE);        return bean;    }     */}

转载于:https://www.cnblogs.com/Sky-Raining/p/10309950.html

最新回复(0)