Spring实现跨域的几种方式小结

 更新时间:2023年07月24日 10:18:29   作者:这是剃刀党的命令  
这篇文章主要给大家总结了几种Spring实现跨域的方式,文中通过代码示例介绍的非常详细,对我们的学习活工作有一定的帮助,需要的朋友可以参考下

1.同源策略

所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)

2.什么是跨域

既然都知道什么是同源策略,那说穿了,只要协议,主机,端口号有一个不同就跨域呗。

3.后端实现跨域的几种方法

  • 返回新的CorsFilter

  • 重写 WebMvcConfigurer

  • 使用注解 @CrossOrigin

  • 手动设置响应头 (HttpServletResponse)

  • 自定web filter 实现跨域 注意:

  • CorFilter / WebMvConfigurer / @CrossOriginspringBoot 1.3以后才支持的。
  • 上面前两种方式属于全局 CORS 配置,后两种属于局部 CORS配置。如果使用了局部跨域是会覆盖全局跨域。正常人都用局部跨域吧?
  • 其实无论哪种方案,最终目的都是修改响应头,向响应头中添加浏览器所要求的数据,进而实现跨域。

1.返回新的 CorsFilter(全局跨域)(基于过滤器)

CorsFilter 是 Spring 框架提供的一个用于处理跨域的过滤器,注意了,人家是属于spring的,不是JDK的,不要瞎搞关系

// 原CORSFilter
@Configuration
public class CorsConfig {
    @Bean
    public CorsFilter  corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        // 允许cookies跨域
        config.setAllowCredentials(true); 
        // #允许向该服务器提交请求的URI,*表示全部允许,自定义可以添加多个,在SpringMVC中,如果设成*,会自动转成当前请求头中的Origin
        config.addAllowedOrigin("*");
        // #允许访问的头信息,*表示全部,可以添加多个
        config.addAllowedHeader("*");
        // 预检请求的缓存时间(秒),即在这个时间段里,对于相同的跨域请求不会再预检了
        config.setMaxAge(1800L);
        // 允许提交请求的方法,*表示全部允许,一般OPTIONS,GET,POST三个够了
        config.addAllowedMethod("*");
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        //对所有接口都有效
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }
}

2.重写 WebMvcConfigurer我们现在需要对请求路径进行拦截,要实现这个需求就要添加拦截器(基于拦截器)

在Spring Boot 1.5版本都是靠重写WebMvcConfigurerAdapter的方法来添加自定义拦截器,消息转换器等。SpringBoot 2.0 后,该类被标记为@Deprecated(弃用)

3.使用注解 @CrossOrigin

在控制器(类上)上使用注解 @CrossOrigin:表示该类的所有方法允许跨域 在方法上使用注解 @CrossOrigin:

原理:当我们使用@CrossOrigin注解时,程序在底层添加了一个拦截器来修改response的headers属性,从而解决跨域问题

4.手动设置响应头 (HttpServletResponse)

@RequestMapping("/index")
public String index(HttpServletResponse response) {
    response.addHeader("Access-Allow-Control-Origin","*");
    return "index";
}

有点抖机灵

5.自定web filter 实现跨域

package com.mesnac.aop;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
@Component
public class MyCorsFilter implements Filter {
  public 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", "POST, GET, OPTIONS, DELETE");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "x-requested-with,content-type");
    chain.doFilter(req, res);
  }
  public void init(FilterConfig filterConfig) {}
  public void destroy() {}
}

到此这篇关于Spring实现跨域的几种方式小结的文章就介绍到这了,更多相关Spring实现跨域内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java 程序员掌握 Spring Boot非常有必要

    Java 程序员掌握 Spring Boot非常有必要

    本文带领大家一起来了解下 Spring Boot 到底是什么?包括springboot的诞生,springboot特征具有哪些优势,如何让开发变得更简单,带着这些问题一起通过本文学习下吧
    2021-06-06
  • java实现String类型和Date类型相互转换

    java实现String类型和Date类型相互转换

    很多人表示,java将string类型转为date类型不知道应该怎样做,本文就来介绍一下java实现String类型和Date类型相互转换,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • SpringCloud之Hystrix的详细使用

    SpringCloud之Hystrix的详细使用

    熔断机制是应对雪崩效应的一种微服务链路保护机制,当扇出链路的某个微服务出错不可用或者响应时间太长,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的相应信息,本文重点给大家介绍SpringCloud Hystrix使用,感兴趣的朋友一起看看吧
    2022-01-01
  • 详解SpringMVC解决跨域的两种方案

    详解SpringMVC解决跨域的两种方案

    本篇文章主要介绍了详解SpringMVC解决跨域的两种方案,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • JAVA实现长连接(含心跳检测Demo)

    JAVA实现长连接(含心跳检测Demo)

    这篇文章主要介绍了JAVA实现长连接(含心跳检测Demo),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • js判断是否是移动设备登陆网页的简单方法

    js判断是否是移动设备登陆网页的简单方法

    这篇文章主要介绍了js判断是否是移动设备登陆网页的简单方法,需要的朋友可以参考下
    2014-02-02
  • javacv-ffmpeg ProcessBuilder批量旋转图片方式

    javacv-ffmpeg ProcessBuilder批量旋转图片方式

    为了批量处理大量图片的旋转,可以使用javacv-ffmpeg结合ProcessBuilder,首先在maven配置文件中添加ffmpeg及javacpp依赖,javacpp支持调用C/C++方法,而ffmpeg基于C语言,使用ProcessBuilder创建进程调用ffmpeg方法
    2024-09-09
  • Java并发工具类Phaser详解

    Java并发工具类Phaser详解

    这篇文章主要介绍了Java并发工具类Phaser详解,Phaser(阶段协同器)是一个Java实现的并发工具类,用于协调多个线程的执行,它提供了一些方便的方法来管理多个阶段的执行,可以让程序员灵活地控制线程的执行顺序和阶段性的执行,需要的朋友可以参考下
    2023-11-11
  • SpringBoot使用validation-api实现参数校验的示例

    SpringBoot使用validation-api实现参数校验的示例

    这篇文章主要介绍了SpringBoot使用validation-api实现参数校验的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 使用Java实现一个不同难度(高、中、低)的猜数字游戏

    使用Java实现一个不同难度(高、中、低)的猜数字游戏

    本文介绍了一个增强版的猜数字游戏,包括菜单打印、游戏维持、逻辑功能选择和源代码展示,游戏通过随机数生成和逻辑判断来维持游戏进程,用户可以选择不同的难度,源代码展示了如何实现这三种不同难度的猜数字游戏,为玩家带来更多挑战和乐趣,需要的朋友可以参考下
    2024-09-09

最新评论