高德地图JSAPI 2.0使用Java代码代替Nginx进行反向代理产生CORS跨域

解决前端访问高德产生的啥啥啥问题,反正问题交给后端做了,

解决高德代理连接:

高德地图JSAPI 2.0使用Java代码代替Nginx进行反向代理https://blog.csdn.net/shechaojin/article/details/126267635?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166747082616782427444491%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=166747082616782427444491&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-1-126267635-null-null.142%5Ev62%5Epc_search_tree,201%5Ev3%5Econtrol,213%5Ev1%5Et3_control1&utm_term=java%E4%BD%BF%E7%94%A8%E9%AB%98%E5%BE%B7%E4%BB%A3%E7%90%86

 

<dependency><groupId>org.mitre.dsmiley.httpproxy</groupId><artifactId>smiley-http-proxy-servlet</artifactId><version>1.12.1</version>
</dependency>

 注册servlet组件 (ServletRegistrationBean) 

    @Beanpublic ServletRegistrationBean servletRegistrationAMapService() {ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new ProxyServlet(), "/_AMapService/*");servletRegistrationBean.setName("AMapService");servletRegistrationBean.addInitParameter(ProxyServlet.P_TARGET_URI, "https://restapi.amap.com");servletRegistrationBean.addInitParameter(ProxyServlet.P_LOG, Boolean.FALSE.toString());return servletRegistrationBean;}

在Filter拦截器中对_AMapService的请求拼接jscode 

private final String AMapJSCode = "xxxxxxxxxxxxx";@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;response.setHeader("Access-Control-Allow-Origin", "*");response.setHeader("Access-Control-Allow-Methods", "POST,GET,PUT,DELETE,OPTIONS");response.setHeader("Access-Control-Max-Age", "3600");StringBuilder allowHeaders = new StringBuilder();allowHeaders.append("accept,content-type,origin,referer,user-agent,Accept,Content-Type,Origin,Referer,User-Agent,Content-MD5,Authentication");response.setHeader("Access-Control-Allow-Headers", allowHeaders.toString());response.setHeader("Access-Control-Allow-Credentials", "true");response.setHeader("Access-Control-Expose-Headers", "version");response.setCharacterEncoding("UTF-8");response.setContentType("application/json;charset=utf-8");if (HttpMethod.OPTIONS.toString().equals(request.getMethod())) {// 设置跨域配置response.setStatus(HttpServletResponse.SC_OK);} else {// 此处为核心代码 将jscode参数进行拼接String requestURI = request.getRequestURI();log.info("requestURI>>>{}", requestURI);boolean isAdd = requestURI.contains("_AMapService");HttpServletRequestWrapper requestWrapper = new HttpServletRequestWrapper(request) {@Overridepublic String getQueryString() {if (isAdd) {return (super.getQueryString() + "&jscode=" + AMapJSCode);}return super.getQueryString();}};filterChain.doFilter(requestWrapper, response);}}

 产生跨域问题时,需要删除response

 HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;// 此处为核心代码 将jscode参数进行拼接String requestURI = request.getRequestURI();log.info("requestURI>>>{}", requestURI);boolean isAdd = requestURI.contains("_AMapService");HttpServletRequestWrapper requestWrapper = new HttpServletRequestWrapper(request) {@Overridepublic String getQueryString() {if (isAdd) {return (super.getQueryString() + "&jscode=" + securityKey);}return super.getQueryString();}};filterChain.doFilter(requestWrapper, response);

 

 解决跨域连接:JAVA Java 解决跨域问题_你好,未来的我的博客-CSDN博客_java解决跨域的三种方法JAVA | Java 解决跨域问题引言什么是跨域(CORS)什么情况会跨域解决方案前端解决方案后端解决方案具体方式一、使用Filter方式进行设置二、继承 HandlerInterceptorAdapter三、实现 WebMvcConfigurer四、使用Nginx配置五、使用 @CrossOrgin 注解Spring Cloud Gateway 跨域配置引言我们在开发过程中经常会遇到前后端分离而导致的跨域问题,导致无法获取返回结果。跨域就像分离前端和https://blog.csdn.net/lidongkui123/article/details/123720743?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166746964616782425123731%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=166746964616782425123731&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-123720743-null-null.142%5Ev62%5Epc_search_tree,201%5Ev3%5Econtrol,213%5Ev1%5Et3_control1&utm_term=java%E5%A4%84%E7%90%86%E8%B7%A8%E5%9F%9F&spm=1018.2226.3001.4187

主要是这段:

JAVA | Java 解决跨域问题

  • 引言
    • 什么是跨域(CORS)
    • 什么情况会跨域
  • 解决方案
    • 前端解决方案
    • 后端解决方案
  • 具体方式
    • 一、使用Filter方式进行设置
    • 二、继承 HandlerInterceptorAdapter
    • 三、实现 WebMvcConfigurer
    • 四、使用Nginx配置
    • 五、使用 @CrossOrgin 注解
  • Spring Cloud Gateway 跨域配置

引言

我们在开发过程中经常会遇到前后端分离而导致的跨域问题,导致无法获取返回结果。跨域就像分离前端和后端的一道鸿沟,君在这边,她在那边,两两不能往来.

什么是跨域(CORS)

跨域(CORS)是指不同域名之间相互访问。跨域,指的是浏览器不能执行其他网站的脚本,它是由浏览器的同源策略所造成的,是浏览器对于JavaScript所定义的安全限制策略。

什么情况会跨域

  • 同一协议, 如http或https
  • 同一IP地址, 如127.0.0.1
  • 同一端口, 如8080

以上三个条件中有一个条件不同就会产生跨域问题。

解决方案

前端解决方案

  1. 使用JSONP方式实现跨域调用;
  2. 使用NodeJS服务器做为服务代理,前端发起请求到NodeJS服务器, NodeJS服务器代理转发请求到后端服务器;

后端解决方案

  • nginx反向代理解决跨域
  • 服务端设置Response Header(响应头部)的Access-Control-Allow-Origin
  • 在需要跨域访问的类和方法中设置允许跨域访问(如Spring中使用@CrossOrigin注解);
  • 继承使用Spring Web的CorsFilter(适用于Spring MVC、Spring Boot)
  • 实现WebMvcConfigurer接口(适用于Spring Boot)

具体方式

一、使用Filter方式进行设置

使用Filter过滤器来过滤服务请求,向请求端设置Response Header(响应头部)的Access-Control-Allow-Origin属性声明允许跨域访问。

@WebFilter
public class CorsFilter implements Filter {  @Overridepublic void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {  HttpServletResponse response = (HttpServletResponse) res;  response.setHeader("Access-Control-Allow-Origin", "*");  response.setHeader("Access-Control-Allow-Methods", "*");  response.setHeader("Access-Control-Max-Age", "3600");  response.setHeader("Access-Control-Allow-Headers", "*");response.setHeader("Access-Control-Allow-Credentials", "true");chain.doFilter(req, res);  }  
}

二、继承 HandlerInterceptorAdapter

@Component
public class CrossInterceptor extends HandlerInterceptorAdapter {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {response.setHeader("Access-Control-Allow-Origin", "*");response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");response.setHeader("Access-Control-Max-Age", "3600");response.setHeader("Access-Control-Allow-Headers", "*");response.setHeader("Access-Control-Allow-Credentials", "true");return true;}
}

三、实现 WebMvcConfigurer

@Configuration
@SuppressWarnings("SpringJavaAutowiredFieldsWarningInspection")
public class AppConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**")  // 拦截所有的请求.allowedOrigins("http://www.abc.com")  // 可跨域的域名,可以为 *.allowCredentials(true).allowedMethods("*")   // 允许跨域的方法,可以单独配置.allowedHeaders("*");  // 允许跨域的请求头,可以单独配置}
}复制代码

四、使用Nginx配置

location / {add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Headers X-Requested-With;add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;if ($request_method = 'OPTIONS') {return 204;}
}
复制代码

五、使用 @CrossOrgin 注解

如果只是想部分接口跨域,且不想使用配置来管理的话,可以使用这种方式

在Controller使用

@CrossOrigin
@RestController
@RequestMapping("/user")
public class UserController {@GetMapping("/{id}")public User get(@PathVariable Long id) {}@DeleteMapping("/{id}")public void remove(@PathVariable Long id) {}
}

在具体接口上使用

@RestController
@RequestMapping("/user")
public class UserController {@CrossOrigin@GetMapping("/{id}")public User get(@PathVariable Long id) {}@DeleteMapping("/{id}")public void remove(@PathVariable Long id) {}
}
  • 1

Spring Cloud Gateway 跨域配置

spring: cloud:gateway:globalcors:cors-configurations:'[/**]':# 允许跨域的源(网站域名/ip),设置*为全部# 允许跨域请求里的head字段,设置*为全部# 允许跨域的method, 默认为GET和OPTIONS,设置*为全部allow-credentials: trueallowed-origins:- "http://xb.abc.com"- "http://sf.xx.com"allowed-headers: "*"allowed-methods:- OPTIONS- GET- POST- DELETE- PUT- PATCHmax-age: 3600

注意: 通过gateway 转发的其他项目,不要进行配置跨域配置

有时即使配置了也不会起作用,这时你可以根据浏览器控制的错误输出来查看问题,如果提示是 response 中 header 出现了重复的 Access-Control-* 请求头,可以进行如下操作

import java.util.ArrayList;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.cloud.gateway.filter.NettyWriteResponseFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;@Component("corsResponseHeaderFilter")
public class CorsResponseHeaderFilter implements GlobalFilter, Ordered {@Overridepublic int getOrder() {// 指定此过滤器位于NettyWriteResponseFilter之后// 即待处理完响应体后接着处理响应头return NettyWriteResponseFilter.WRITE_RESPONSE_FILTER_ORDER + 1;}@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {return chain.filter(exchange).then(Mono.defer(() -> {exchange.getResponse().getHeaders().entrySet().stream().filter(kv -> (kv.getValue() != null && kv.getValue().size() > 1)).filter(kv -> (kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN)|| kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS)|| kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS)|| kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS)|| kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_MAX_AGE))).forEach(kv -> {kv.setValue(new ArrayList<String>() {{add(kv.getValue().get(0));}});});return chain.filter(exchange);}));}
}

作者:双鬼带单
链接:https://juejin.cn/post/6874163312918003719
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/442642.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录生产其妙BUG

奇妙bug本地复现不了&#xff0c;sit环境有问题&#xff0c;最后才发现本地一毫秒处理三十多条数据&#xff0c;所以每隔三十多秒就会有不同的时间&#xff0c;服务器每秒处理数量超过了预期数量&#xff0c;所以sit很容易复现 由于使用lindorm存在诸多限制。有一个业务数据量…

计算页数_中级会计师计算题、综合题的审题注意事项与解题思路

为什么要进行考前冲刺根据多年的考试和培训经验&#xff0c;考前过一遍课本是必须的&#xff0c;且提分相当明显。换种解释方式如果平时测试在40分左右的同学通过最后一个月的冲刺考过的概率能增加65%以上&#xff0c;但最后一个月抓不住机会就只能搁置到明年再考。时不待我&am…

使用中断后不停止_仓鼠偷吃鼠粮,被发现后立刻停止,但鼠鼠满脸不情愿

贪玩馋嘴&#xff0c;是很多宠物的天性&#xff0c;在主人不在家的时候&#xff0c;往往是它们暴露本性的时候。提起贪玩&#xff0c;人们往往会想到哈士奇&#xff0c;因为它们能在主人不在家的时候&#xff0c;把整个屋子给拆了&#xff1b;而提起贪吃&#xff0c;仓鼠却总被…

记录分库分表的分页查询

分库分表的分页查询。不同的业务场景可能不同。我只记录自己的分页方法 public PageAO<User> selectByPage(Filter filter, int page, int size) {//每页条数int pageSize size < 1 ? 10 : size;//计算起始位置int pageIndex page < 1 ? 0 : (page - 1) * pag…

c++查询当前文件夹下文件数目_python3自动化小工具--删除某个文件夹xx后缀文件...

源码 DelSomeFile.py""" 此代码用于删除文件夹下面以txt结尾的文件 &#xff08;同理将.txt-->.py可以删除py文件&#xff09; 借用pyqt5调用文件选择对话框看起来比较人性化点 本来是用win32ui的&#xff0c;但是win32ui不太人性化&#xff0c;不能选择文件…

creo组装后怎样移动元件_BGA元件SMT装配工艺要点简介

当SMT&#xff08;表面贴装技术&#xff09;/SMD&#xff08;表面贴装器件&#xff09;从业者发现间距为0.3mm的QFP&#xff08;四方扁平封装&#xff09;无法实现时&#xff0c;BGA&#xff08;球栅阵列&#xff09;的出现肯定会减少装配缺陷确保SMT质量成就。从系统理论的角度…

burpsuite csrf攻击_WEB安全之CSRF

大家好&#xff0c;我是阿里斯&#xff0c;一名IT行业小白。今天分享的内容是CSRF相关知识&#xff0c;不求表哥们打赏&#xff0c;只求点点在看&#xff0c;点点转发。CSRF漏洞概述CSRF(Cross-Site Request Forgery),中文名为跨站请求伪造&#xff0c;是一种Web攻击方式。该漏…

财物机器人英文ppt演讲课件_“如何恰当使用课件动画”

每晚21&#xff1a;30分享教师干货记得当大姜老师还是一名稚嫩的大一新生时&#xff0c;由于小时候家里管的比较严&#xff0c;几乎没什么碰电脑的机会。即便有了难得的机会&#xff0c;也都用来打游戏了......直到上了大学&#xff0c;需要做各种的汇报PPT、课件PPT、演讲PPT&…

curl 请求日志_kong api网关日志 将请求和响应数据附加到磁盘上的日志文件中

术语plugin&#xff1a;在请求被代理到上游API之前或之后&#xff0c;在Kong内部执行操作的插件。Service&#xff1a;表示外部上游 API或微服务的Kong实体。Route&#xff1a;Kong实体&#xff0c;表示将下游请求映射到上游服务的方法。Consumer&#xff1a;表示使用API​​的…

怎么主动发起话题_为什么男生不愿意主动追求女生了?这或许是最终的核心原因...

作为一个在情感领域和心理学领域深耕了许久的半吊子研究人员&#xff0c;对于情感话题一向都比较感兴趣。为什么男生不愿意主动追求女生了&#xff1f;这大概是近两年两性恋爱关系中最热门的话题了&#xff0c;每次都想在问答中回复&#xff0c;都没有想到一个完整的答案&#…

关闭 Pycharm 更新提示

File > settings > Appearance & Behavior > System Settings > Upadates 取消勾选 Automatically check updates for ……

golang errors 取 错误 信息_Golang 单元测试:有哪些误区和实践?

背景测试是保证代码质量的有效手段&#xff0c;而单元测试是程序模块儿的最小化验证。单元测试的重要性是不言而喻的。相对手工测试&#xff0c;单元测试具有自动化执行、可自动回归&#xff0c;效率较高的特点。对于问题的发现效率&#xff0c;单测的也相对较高。在开发阶段编…

节能prru进入深度休眠节能_2021-2024年中国工业节能行业深度调研及投资前景预测报告...

近年来&#xff0c;随着供给侧结构性改革不断深化&#xff0c;工业经济发展势头良好&#xff0c;转型升级步伐进一步加快&#xff0c;生产稳定增长、结构持续优化、效益明显提高、新动能加速成长。随着中国工业节能的政策推力逐渐加大&#xff0c;工业节能市场迅速发展&#xf…

多布局怎么搭建_关键词SEO优化怎么做?具体包括哪些方面?

在互联网的活动中&#xff0c;网站优化是企业们提升网站排名的常用方法之一&#xff0c;这也是进行线上获客的重要手段&#xff0c;超过75%的中小企业都非常认可这种营销方式。但是&#xff0c;想要做好关键词的优化&#xff0c;网站关键词定位、关键词布局、关键词密度等等都是…

使用特征_R语言-使用caret包实现特征选择:递归特征消除(RFE)算法

在caret&#xff08;short for classification and regression training&#xff09;包中有多个函数可以实现特征选择&#xff0c;总的分为封装法和过滤法。封装法&#xff0c;将特征选择过程与训练过程融合在一起&#xff0c;以模型的预测能力作为特征选择的衡量标准。封装法可…

7 centos 查看程序文件数量_「动手打造家庭媒体网络平台」安装篇-centos搭建DLNA媒体服务...

大家好&#xff0c;我是路程lucky&#xff0c;热爱开发、设计、学习、生活、爱捣鼓的web前后端工程师~本文的重点是在之前文章提到创建的centos基础上继续搭建DLNA媒体服务。由于centos的系统是从零开始初步安装完成&#xff0c;我们在安装媒体服务时&#xff0c;不可避免出现各…

python 逻辑回归准确率是1_python数据分析(三)——逻辑回归之学生成绩预测

Python数据分析项目——学生成绩预测一&#xff0e;数据源阿里云天池公开数据集&#xff1a;学生成绩预测数据集https://tianchi.aliyun.com/dataset/dataDetail?dataId6785特征(Features)介绍&#xff1a;Gender: 性别Nationality: 国籍PlaceofBirth&#xff1a;出生地StageI…

向量数量积公式_多法 | 向量数量积相关最值问题的常见处理方法

近日QQ群更新的部分内容如下高中11大类86个易错点全梳理(185页Word)恒成立涉及10大类40小类题型梳理(100页Word)高中数学10大专题100个考点配例题全梳理2020高考真题分类汇编理科(14讲Word)2019年江苏高考数学题根系列(50份Word)2020届江苏高三上期中期末分类汇编(12讲Word)202…

kettle增加字段报错_【实战】使用 Kettle 工具将 mysql 数据增量导入到 MongoDB 中

每一个成功人士的背后&#xff0c;必定曾经做出过勇敢而又孤独的决定。放弃不难&#xff0c;但坚持很酷~最近有一个将 mysql 数据导入到 MongoDB 中的需求&#xff0c;打算使用 Kettle 工具实现。本文章记录了数据导入从 0 到 1 的过程&#xff0c;最终实现了每秒钟快速导入约 …

增量同步_使用Kettle工具进行增量数据同步

增量同步的方式有很多种&#xff0c;我使用的是: 快照表 触发器需求&#xff1a;当主库库表发生增删改时&#xff0c;从库库表与主库库表数据保持一致。环境&#xff1a;1、Mysql2、kettle 7.1思路&#xff1a;1、在主库中&#xff0c;将需要同步的库表新建快照表&#xff0c;…