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

这篇具有很好参考价值的文章主要介绍了Java跨域问题的几种后端解决方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

@Configuration
public 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 方法中设置响应头以实现跨域。

@Component
public 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 方法中设置响应头以实现跨域。

@WebFilter
public 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")
@RestController
public class MyController {
    // ...
}
```

这将允许来自 http://example.com 的跨域请求访问 MyController 中的方法。

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

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

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

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

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

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

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

@CrossOrigin(origins = "http://example.com", allowCredentials = "true")
@RestController
public 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>.*), /$\{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,表示允许发送身份验证信息。例如:文章来源地址https://www.toymoban.com/news/detail-721778.html

- AddResponseHeader=Access-Control-Allow-Credentials:true
`````

最后,需要将这些配置添加到每个需要跨域访问的 API 的路由配置中。

需要注意的是,如果在 Gateway 的路由中使用了负载均衡,需要在负载均衡的路由配置中添加以上配置。如果使用了反向代理,也需要在反向代理的路由配置中添加以上配置。

到了这里,关于Java跨域问题的几种后端解决方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【SpringBoot系列】实现跨域的几种方式

    前言 在Web开发中,跨域是一个常见的问题。由于浏览器的同源策略,一个Web应用程序只能访问与其自身同源(即,相同协议、主机和端口)的资源。 这种策略的存在是为了保护用户的安全,防止恶意网站读取或修改用户的数据。 然而,现代Web应用程序经常需要访问不同源的

    2024年02月01日
    浏览(40)
  • Java实现后端跨域的常见解决方式

    1.1、maven依赖 pom.xml 1.2、接口 1.3、配置 application.properties   至此我们就提供了一个接口: http://localhost:8080/crossServer/cross/request 2.1、maven依赖 pom.xml 2.2、接口 2.3、页面 2.4、配置 application.properties   至此我们就提供了一个接口: http://localhost:8081/crossWeb/test/request ,访问此页

    2024年02月09日
    浏览(33)
  • 探究Spring Boot 中实现跨域的几种方式

    在现代Web应用中,由于安全性和隐私的考虑,浏览器限制了从一个域向另一个域发起的跨域HTTP请求。解决这个问题的一种常见方式是实现跨域资源共享(CORS)。Spring Boot提供了多种方式来处理跨域请求,本文将介绍其中的几种方法。 Spring Boot提供了一个注解 @CrossOrigin ,可以

    2024年02月05日
    浏览(31)
  • 解决前端跨域的几种方法

    一、跨域报错         在我们实际开发过程中,都有遇到过跨域的问题,跨域报错如下: 二、为什么会报跨域?         跨域的本质是浏览器基于同源策略的一种安全手段,主要是考虑到用户的信息安全。何为同源策略呢?同源策略是一种约定,它是浏览器最核心也

    2024年02月09日
    浏览(30)
  • vue解决跨域的几种办法

    当我们遇到请求后台接口遇到 Access-Control-Allow-Origin 时,那说明跨域了。 跨域是因为浏览器的同源策略所导致,同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,同源是指:域名、协议、端口相同 解决跨域常用方法: 一、VUE中常用proxy来解决跨

    2024年02月15日
    浏览(26)
  • springBoot使用webSocket的几种方式以及在高并发出现的问题及解决

    1、该类可以作为一个基础的安全抽象层,后续项目中如果需要做认证的操作,都可以继承该抽象类 ClientUserInfoService 大家可以看作一个 UserService 就是一张用户表的service类 这里认证采用的是 jwt的方式,大家可以换成自己的 2、 大家这里注意,我们使用的是 javax.websocket.Sessio

    2024年02月09日
    浏览(37)
  • 前端h5页面和后端php服务的几种部署方式

    和java后端服务的部署不同,前端h5的部署有好几种。 CDN+OSS nginx反向 把输出物全部拷贝到后端 所以,这就带来了部署上的歧义,到底该用哪种部署方式呢? 本文以前端h5搭配后端php程序为示例,试着讨论一下他们之间的配合部署。 这里的前端h5是仅限静态页面,不包括nodej

    2024年01月17日
    浏览(34)
  • 浏览器同源策略导致跨域问题 No ‘Access-Control-Allow-Origin‘ header 原因及解决方式--(后端、nginx、前端)

    目录 现象 原因 浏览器同源策略 导致结果: 解决方案 跨源资源共享(CORS) 各个端解决方法: 后端: 方式1:重载WebMvcConfigurer方法 方式2:配置监听CorsFilter 方式3:相关类上加注解 @CrossOrigin 注意事项: Nginx解决: 情况1: 前端解决: 本人身份:后端 今天部署线上环境前端

    2024年01月23日
    浏览(41)
  • java篇-Springboot解决跨域问题的三种方式

    第一种:添加 @CrossOrigin 注解 在Controller层对应的方法上添加@CrossOrigin或者类上添加@CrossOrigin   第二种:添加CORS过滤器 新建配置类CorsConfig,创建 CorsFilter 过滤器,允许跨域  第三种:实现 WebMvcConfigurer ,重写 addCorsMappings 方法 全局配置有可能出现跨域失败的情况,改为过滤

    2024年04月23日
    浏览(31)
  • Java创建对象的几种方式

    在Java中,对象是程序中的一种基本元素,它通过类定义和创建。本篇教程旨在介绍Java中创建对象的几种方式,包括使用new、反射、clone、反序列化等方式。 在Java中,最常用的创建对象方式是使用new。使用new创建对象的具体步骤如下: 使用new并指定

    2024年02月12日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包