返回顶部
首页 > 资讯 > 后端开发 > JAVA >Java跨域问题的几种后端解决方式
  • 620
分享到

Java跨域问题的几种后端解决方式

java开发语言servletintellij-ideagateway 2023-09-29 20:09:55 620人浏览 安东尼
摘要

文章目录 Java跨域问题解决方式一、什么是跨域二、常见跨域举例三、Java后端解决方式1、实现 WebMvcConfigurer2、实现 HandlerInterceptor3、使用Filt

文章目录

Java跨域问题解决方式

一、什么是跨域

跨域指的是:浏览器不能执行其他网站的脚本,从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域。跨域是由浏览器的同源策略造成的,是浏览器施加的安全限制。a页面想获取b页面资源,如果a、b页面的协议、域名、端口、子域名不同,所进行的访问行动都是跨域的。

二、常见跨域举例

当前页面URL被请求页面URL是否跨域原因
Http://www.test.com/http://www.test.com/index.html同源 (协议、域名、端口号相同)
http://www.test.com/https://www.test.com/index.html跨域协议不同 (http/https)
http://www.test.com/http://www.baidu.com/跨域域名不同 (test/baidu)
http://www.test.com/http://blog.test.com/跨域域名不同 (www/blog)
http://www.test.com:8080/http://www.test.com:7001/跨域端口号不同 (8080/7001)

三、Java后端解决方式

1、实现 WEBmvcConfigurer

@Configurationpublic class CorsConfig implements WebMvcConfigurer {    @Override    public void addCorsMappings(CorsReGIStry registry) {        registry.addMapping("/**")// 拦截所有的请求            .allowedOrigins("*")// 可跨域的域名,*为所有            .allowCredentials(true)            .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")// 允许跨域的方法,可以单独配置            .maxAge(3600);    }}

2、实现 HandlerInterceptor

创建一个类实现 HandlerInterceptor 接口,并在 preHandle 方法中设置响应头以实现跨域。

@Componentpublic class CorsInterceptor implements HandlerInterceptor {    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {        response.setHeader("Access-Control-Allow-Origin", "http://example.com");        response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");        response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");        response.setHeader("Access-Control-Allow-Credentials", "true");        return true;    }    // ...}```这将允许来自 http://example.com 的跨域请求访问应用程序中的 api

3、使用Filter

创建一个类实现 javax.servlet.Filter 接口,并在 doFilter 方法中设置响应头以实现跨域。

@WebFilterpublic class CorsFilter implements Filter {    @Override    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {        HttpServletResponse response = (HttpServletResponse) res;        response.setHeader("Access-Control-Allow-Origin", "http://example.com");        response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");        response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");        response.setHeader("Access-Control-Allow-Credentials", "true");        chain.doFilter(req, res);    }    // ...}````这将允许来自 http://example.com 的跨域请求访问应用程序中的 API。

注意:使用 Filter 实现跨域时,Filter 会拦截所有请求,而不仅仅是跨域请求。因此,在设置响应头时需要谨慎,避免影响其他请求的正常处理。如果需要更细粒度的控制,可以考虑使用 @CrossOrigin 注解或拦截器来实现。

4、使用 @CrossOrigin 注解来实现

在使用 Spring Boot 实现跨域时,可以使用 spring 提供的 @CrossOrigin 注解来配置跨域访问。具体实现步骤如下:

(1)在需要实现跨域的 Controller 类或方法上添加 @CrossOrigin 注解。例如:

@CrossOrigin(origins = "http://example.com")@RestControllerpublic class MyController {    // ...}```这将允许来自 http://example.com 的跨域请求访问 MyController 中的方法。

(2)如果需要允许多个域名访问,可以将 origins 参数设置为包含所有允许访问的域名的数组。例如:

@CrossOrigin(origins = {"http://example1.com", "http://example2.com"})@RestControllerpublic class MyController {    // ...}```

(3)如果需要允许跨域的 HTTP 方法不止 GET 和 POST,可以使用 methods 参数指定允许的方法列表。例如:

@CrossOrigin(origins = "http://example.com", methods = {RequestMethod.GET, RequestMethod.POST})@RestControllerpublic class MyController {    // ...}```

(4)如果需要允许跨域的请求头不止 Content-Type,可以使用 allowedHeaders 参数指定允许的请求头列表。例如:

@CrossOrigin(origins = "http://example.com", allowedHeaders = {"Content-Type", "Authorization"})@RestControllerpublic class MyController {    // ...}```

(5)如果需要允许发送身份验证信息,可以使用 allowCredentials 参数将其设置为 true。例如:

@CrossOrigin(origins = "http://example.com", allowCredentials = "true")@RestControllerpublic class MyController {    // ...}```

5、在响应头中添加 Access-Control-Allow-Origin 等字段

(1)在响应头中添加 Access-Control-Allow-Origin 字段,允许特定的域名访问。例如,以下代码将允许 http://example.com 的域名访问 API:

response.setHeader("Access-Control-Allow-Origin", "http://example.com");```    如果希望允许所有域名访问 API,可以将值设置为 *

(2)如果需要允许多个域名访问 API,可以在响应头中添加 Access-Control-Allow-Origin 字段,并将其设置为包含所有允许访问的域名的列表。例如:

response.setHeader("Access-Control-Allow-Origin", "http://example1.com, http://example2.com");```

(3)如果需要允许跨域的 HTTP 方法不止 GET 和 POST,可以在响应头中添加 Access-Control-Allow-Methods 字段,指定允许的方法列表。例如:

response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");```

(4)如果需要允许跨域的请求头不止 Content-Type,可以在响应头中添加 Access-Control-Allow-Headers 字段,指定允许的请求头列表。例如:

response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");```

(5)如果使用了带有身份验证信息的请求,例如带有 Cookie 的请求,那么需要在响应头中添加 Access-Control-Allow-Credentials 字段,并将其设置为 true,表示允许发送身份验证信息。例如:

response.setHeader("Access-Control-Allow-Credentials", "true");```最后,需要将这些响应头添加到每个需要跨域访问的 API 的响应中。

6、使用 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;   }}

如果使用了带有身份验证信息的请求,例如带有 Cookie 的请求,那么需要将 Access-Control-Allow-Credentials 字段设置为 true,表示允许发送身份验证信息。例如:

add_header 'Access-Control-Allow-Credentials' 'true';

如果在 Nginx 的 upstream 中使用了负载均衡,需要在负载均衡的服务器块中添加以上配置。如果使用了反向代理,也需要在反向代理的服务器块中添加以上配置。

7、配置 Gateway 的路由

- id: my_route  uri: http://localhost:8080  predicates:    - Path=/api/**  filters:    - RewritePath=/api/(?>.*), /$\{segment}    - AddResponseHeader=Access-Control-Allow-Origin:http://example.com    - AddResponseHeader=Access-Control-Allow-Methods:GET, POST, PUT, DELETE    - AddResponseHeader=Access-Control-Allow-Headers:Content-Type, Authorization    - AddResponseHeader=Access-Control-Allow-Credentials:true`````这将允许来自 http://example.com 的跨域请求访问 Gateway 中的 API。

如果使用了带有身份验证信息的请求,例如带有 Cookie 的请求,那么需要将 Access-Control-Allow-Credentials 字段设置为 true,表示允许发送身份验证信息。例如:

- AddResponseHeader=Access-Control-Allow-Credentials:true`````最后,需要将这些配置添加到每个需要跨域访问的 API 的路由配置中。需要注意的是,如果在 Gateway 的路由中使用了负载均衡,需要在负载均衡的路由配置中添加以上配置。如果使用了反向代理,也需要在反向代理的路由配置中添加以上配置。

来源地址:https://blog.csdn.net/dedede001/article/details/130503843

--结束END--

本文标题: Java跨域问题的几种后端解决方式

本文链接: https://lsjlt.com/news/421632.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java跨域问题的几种后端解决方式
    文章目录 Java跨域问题解决方式一、什么是跨域二、常见跨域举例三、Java后端解决方式1、实现 WebMvcConfigurer2、实现 HandlerInterceptor3、使用Filt...
    99+
    2023-09-29
    java 开发语言 servlet intellij-idea gateway
  • java后端解决跨域的几种问题解决
    1.java过滤器过滤 允许整个项目跨域访问,可通过filter来进行过虑: public class SimpleCORSFilter implements Filter{ ...
    99+
    2024-04-02
  • java后端进行跨域的几种方式小结
    目录一、使用@CrossOrigin注解二、重写addCorsMappings方法三、添加CORS过滤器一、使用@CrossOrigin注解 在controller类上加上@Cros...
    99+
    2023-03-19
    java后端跨域 java 跨域
  • 分享后端解决跨域问题的三种方案
    1.跨域的介绍 跨源资源共享(CORS——Cross-Origin Resource Sharing,跨源资源共享,或通俗地译为跨域资源共享)是一种基于 HTTP 头的机制,该机制通过允许服务器标示除了它自己以外的其它源(域、协议或端口)...
    99+
    2023-09-01
    spring boot 网络 java Powered by 金山文档
  • java后端怎么解决跨域问题
    在Java后端解决跨域问题可以使用以下几种方法: 使用Servlet的过滤器:创建一个实现javax.servlet.Filte...
    99+
    2023-10-23
    java
  • SpringBoot跨域问题的五种解决方式
    目录一、什么是跨域 CORS二、为什么会有跨域问题三、有哪些跨域类型四、解决跨域问题的五种方式1. 添加跨域配置类2. 重写WebMvcConfigurer3. 注解 @CrossO...
    99+
    2024-04-02
  • 【Java】Java中解决跨域问题的几种方法(建议收藏)
    文章目录 背景一、什么是跨域?为什么会出现跨域二、Java实现跨域方式2.1、返回新的 CorsFilter(全局跨域)2.2、重写 WebMvcConfigurer(全局跨域)2.3、使用注解 (局部跨域)2.4、手动设置响应头(...
    99+
    2023-08-30
    java
  • SpringBoot前后端分离解决跨域问题的3种解决方案总结
    目录什么是跨域跨域问题的解决策略三种解决方法总结什么是跨域 想要知道什么是跨域的话,我们可以通过一个小案例简单了解一下跨域的概念:在项目代码编写的时候,我们将前端项目代码和后端的项目...
    99+
    2024-04-02
  • 最新springboot解决跨域的几种方式小结
    目录什么是跨域springboot解决跨域的几种方式方法一、SpringBoot的注解@CrossOrigin方式二:使用CorsFilter方式三:自定义过滤(web  ...
    99+
    2024-04-02
  • springboot解决前后端分离时的跨域问题
    目录一、为什么会跨域? 二、什么是跨域? 三、处理跨域 1、在controller的类上或方法上添加注解 2、在启动类配置全局cors(springboot2.0已经过时)3、注册c...
    99+
    2024-04-02
  • 前后端跨域解决方案
    目录 一、为什么会有跨域问题二、解决跨域方案有哪些三、解决跨域最佳方案是什么四、Spring中如何引入CORS 一、为什么会有跨域问题 跨域问题是由于浏览器的同源策略导致的。同源策略是一种安全策略,它限制了一个源的文档或脚本...
    99+
    2023-08-20
    前端 服务器 javascript
  • 关于后端如何解决跨域的问题说明
    目录什么是跨域请求什么是同源策略同源策略限制内容有那什么又是同源?跨域解决方案1.jsonp2.cors3.@CrossOrigin注解4.使用SpringCloud网关5.Node...
    99+
    2024-04-02
  • 如何解决VueJs前后端分离跨域问题
    这篇文章给大家分享的是有关如何解决VueJs前后端分离跨域问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。使用vue-cli搭建的vue项目可以使用在项目内设置代理(proxy...
    99+
    2024-04-02
  • 解决SpringBoot跨域的三种方式
    目录一、什么是跨域1.1、为什么会出现跨域问题1.2、什么是跨域1.3、非同源限制1.4、如何解决跨域问题二、SpringBoot解决跨域问题2.1、配置CorsFilter(全局跨...
    99+
    2024-04-02
  • springboot怎么解决前后端分离时的跨域问题
    这篇文章主要介绍springboot怎么解决前后端分离时的跨域问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!springboot是什么springboot一种全新的编程规范,其设计目的是用来简化新Spring应用...
    99+
    2023-06-14
  • java怎么解决跨域问题
    为了解决 Java 中的跨域问题,可以采取以下方法: 修改服务器端配置:在服务器端的响应中添加响应头,允许指定的源访问该资源。可...
    99+
    2024-02-29
    java
  • 跨域浏览器设置解决前端跨域问题
    目录一、什么是跨域二、什么情况下会出现跨域三、uni-app 项目 解决跨域办法四、Vue.js 项目 解决跨域办法五、终极解决办法,删除浏览器跨域限制一、什么是跨域 出于浏览器的同...
    99+
    2024-04-02
  • java后端进行跨域的方式有哪些
    这篇文章主要讲解了“java后端进行跨域的方式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java后端进行跨域的方式有哪些”吧!一、使用@CrossOrigin注解在controll...
    99+
    2023-07-05
  • 解决vue项目中前后端交互的跨域问题、nginx代理配置方式
    目录vue前后端交互的跨域问题、nginx代理配置1.安装axios2.解决跨域问题前后端分离项目的跨域问题及解决跨域简述解决办法vue前后端交互的跨域问题、nginx代理配置 最近...
    99+
    2024-04-02
  • java几种乱码问题解决方法
    几种java乱码情况解决方法:在Servlet中获得通过get方式传递到服务器的数据时出现乱码; public class RegistServlet extends HttpServlet{ @Override prote...
    99+
    2021-04-13
    java 乱码
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作