之前写实验室官网连调阶段出现了跨域问题,一开始我是写了一个拦截器来解决问题,但是在个别接口仍然会出现问题,然后使用@CrossOrigin来解决,但是@CrossOigin注解默认是不支持put和delete方法的,我在网上查询了cors的细粒度配置,尝试了能查到的所有方法失败,最后还是采用了filter加nginx配置的方式来解决问题

出现跨域问题时,一般是 PUT,DELETED 两种请求,当浏览器请求时,会发送两个请求到 nginx。
其中一个请求类型为 options,一个请求为 PUT 或者 DELETED。
nginx 需要对 options 请求进行拦截,返回 200,并添加响应的头。

1.AllowOriginFilter代码

public class AllowOriginFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletResponse response = (HttpServletResponse) servletResponse;HttpServletRequest request = (HttpServletRequest) servletRequest;String origin = request.getHeader("Origin");if (StringUtils.isNotBlank(origin)) {//设置响应头,允许跨域访问//带cookie请求时,必须为全匹配,不能使用*/*** 表示允许 origin 发起跨域请求。*/response.addHeader("Access-Control-Allow-Origin", origin);}/*** GET,POST,OPTIONS,PUT,DELETE 表示允许跨域请求的方法*/response.addHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS, PUT, DELETE, HEAD, PATCH");/*** 表示在86400秒内不需要再发送预校验请求*/response.addHeader("Access-Control-Max-Age", "86400");//支持所有自定义头String headers = request.getHeader("Access-Control-Request-Headers");if (StringUtils.isNotBlank(headers)) {//允许JSON请求,并进行预检命令缓存response.addHeader("Access-Control-Allow-Headers", headers);}response.addHeader("Access-Control-Max-Age", "3600");//允许cookieresponse.addHeader("Access-Control-Allow-Credentials", "true");/*** 设置content-type*/
//         response.addHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");filterChain.doFilter(servletRequest, response);}@Overridepublic void destroy() {}
}

2.注入

@Configuration
@EnableWebMvc
@ComponentScan("这里填自己的项目")
public class WebConfiguration extends WebMvcConfigurerAdapter {/*** 解决DELETE、PUT参数获取不到** @return*/@Beanpublic FormContentFilter formContentFilter() {return new FormContentFilter();}/*** 注入RestTemplate** @return*/@Beanpublic RestTemplate getRestTemplate() {return new RestTemplate();}/*** 跨域Fileter注入** @return 跨域注册Bean对象*/@Beanpublic FilterRegistrationBean registerFilter() {FilterRegistrationBean bean = new FilterRegistrationBean();bean.addUrlPatterns("/*");bean.setFilter(new AllowOriginFilter());return bean;}
}

3.nginx配置

http {server{listen 80;
#server_name 你的域名;
#location / {#try_files $uri $uri/ =404;proxy_pass http://localhost:8080;# proxy_cookie_path /api/ /;proxy_cookie_path /weily /;proxy_set_header Host $host:80;proxy_set_header Referer $http_referer;proxy_set_header Cookie $http_cookie;proxy_set_header X-Real-Ip $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header Content-Type $content_type;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "Upgrade";if ($request_method = 'OPTIONS') {add_header Access-Control-Allow-Origin $http_origin;add_header Access-Control-Allow-Credentials true;add_header Access-Control-Allow-Headers content-type;add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,PATCH,OPTIONS;return 200;}client_max_body_size 1024m;}}
}

nginx配置解决跨域问题相关推荐

  1. nginx 代理解决跨域问题

    前言 可能在某些时候我们的前端项目需要访问一些外部的接口,比如Apollo等,而直接使用axios发送请求的话,会报跨域的错误,具体什么是跨域这里就不啰嗦了,如下图. 这个接口地址当然是正确的,可以放 ...

  2. Nginx配置cros跨域以及遇到401响应的问题

    nginx配置cros跨域以及遇到401.500响应的问题 这是我Nginx的server配置: server {listen 80;server_name DataAnalysis;location ...

  3. JAVA商城项目(微服务框架)——第7天nginx+cors解决跨域+品牌+分类查询

    0.学习目标 使用资料搭建后台系统 会使用nginx进行反向代理 实现商品分类查询功能 掌握cors解决跨域 实现品牌查询功能 1.搭建后台管理前端 1.1.导入已有资源 后台项目相对复杂,我们不再从 ...

  4. Nginx 轻松解决跨域问题

    当你遇到跨域问题,不要立刻就选择复制去尝试.请详细看完这篇文章再处理 .我相信它能帮到你. # 分析前准备: 前端网站地址:http://localhost:8080 服务端网址:http://loc ...

  5. vue配置解决跨域问题

    我们在使用vue时,经常要遇到跨域的问题,其实这个问题很好解决,只需我们在vue-cli中配置一下即可. 实现跨越请求: 在config文件夹下找到index.js proxyTable: {&quo ...

  6. vue服务器代理proxyTable配置解决跨域

    目录 1.Proxy代理作用 2 .常见情况 3.应用方式 4.具体配置实例 5.配置思路 代理原理 总结 1.Proxy代理作用 proxy代理作用:前端服务器代理的作用是,告诉服务器任何未知请求( ...

  7. Flask + Nginx + React + Webpack 配置解决跨域问题

    用 Flask 做后端开发单页应用,webpack-dev-server 生成静态文件在http://localhost:8080 下,Flask 页面在 http://localhost:5000 ...

  8. ng配置解决跨域请求

    问题概述 前端h5请求后端服务,两者的域名不同,报出这样的错误 No 'Access-Control-Allow-Origin' header is present on the requested ...

  9. nginx配置图片跨域访问

    在server段中添加红框内的图片跨域内容 参数 location ~* .*.(gif|jpg|jpeg|png|bmp|swf)$ { add_header Access-Control-Allo ...

  10. 前后分离,测试环境使用nginx调试解决跨域问题。

最新文章

  1. IDEA中如何彻底删除项目
  2. 浅谈Android保护技术__代码混淆
  3. 日历控件的android代码,Android日历控件PickTime代码实例
  4. Maven项目依赖管理工具
  5. binary_sort 二叉树
  6. 定时执行 Job - 每天5分钟玩转 Docker 容器技术(135)
  7. 一个逼格很低的appium自动化测试框架
  8. 《Python 黑科技》程序员必须会的代理ip小技巧
  9. windows下,linux下elasticsearch安装插件marvel插件的步骤
  10. 语音识别开放化开发平台有哪些?
  11. python工厂模式看不懂_python模式 工厂模式原理及实例详解
  12. 两阶段最小二乘法TSLS案例分析
  13. 几种不同的json格式解析
  14. java sendkeys方法_java+selenium——键盘操作+复制粘贴(keys类)
  15. 如何优化在搜索引擎上的友好度
  16. 直通车点击软件测试自学,【图片】最给力直通车点击软件,防御直通车恶意点击秒杀软件,可测试效果_直通车吧_百度贴吧...
  17. 斜杠【/】 与 反斜杠【\】
  18. 命令行登陆北邮校园网
  19. fprint函数与print函数
  20. 智能物联网网关有哪些必备功能

热门文章

  1. RGB888转换为RGB565原理及工具
  2. 步进电机驱动A4988,步进电机驱动程序编写
  3. 小程序服务器新消息通知,如何在手机上实时接收微信小程序客服消息提醒?
  4. 华为PUSH推送所有Token都不合法
  5. 40 个免费的面向编程初学者的视频教程
  6. [AutoCAD.Net][事件] AUTOCAD 选择对象后触发事件
  7. 离线电商数仓3.0项目即席查询复盘笔记
  8. (Python2.7.x) Systrace 使用的坑,出现 ImportError: No module named XXX
  9. 十分好用PDF转换成PPT转换器
  10. aplay与call