Spring MVC跨域问题及解决

2025-03-13 12:50

本文主要是介绍Spring MVC跨域问题及解决,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《SpringMVC跨域问题及解决》:本文主要介绍SpringMVC跨域问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教...

跨域问题

不同的域

协议、域名、端口,三者只要有一个不同,就叫不同的域

比如

http:/moon.com/test去拉取下列url对应的资源

URL是否跨域
http:/moon.com/test不算跨域
http:/www.moon.com/test算跨域
https:/moon.com/test算跨域

Tips:

  • 不同的域对协议域名端口三者的检查是非常严格的,比如从http://localhost:8080/test去拉取http://127.0.0.1:8080/test2算跨域的,因为域名不一样,虽然他们表达的意思一样。

同源策略

浏览器自身会组织从一个域加载的脚本获取另外一个域的资源

Tips:

  • 对于css和js这样的资源是不会触发同源策略

解决方法

1.CORS

跨域资源共享,因为它支持所有类型的HTTP请求

Tips:

  • 只能解决浏览器跨域问题,如果涉及到App,小程序,物联网设备跨域,SpringMVC这一套不一定生效

2.JSONP

前端可以通过JSONP来进行获取跨域资源,但是只支持GET请求

3.局部解决方案

@CrossOrigin

在方法或者类上加上@CrossOrigin这个注解,设置响应头中允许的跨域访问的请求域,*代表所有,也可以通过字符串数组的形式进行逐一放行

@CrossOrigin({"http://localhost:8081", "http://localhost:8082"})
@GetMapping("/request")
public Student rest1(HttpServletResponse response) {
  Student student = new Student();vlxycvYb
  student.setName("GET晓龙");
  student.setAge(23);
  student.setBirthday(new Date());
  return student;
}

Tips:

  • 注解中的maxAge属性表示预检请求结果缓存的最大时长,单位为秒,默认为1800s,即30分钟

4.全局解决方法

对于浏览器的跨域问题,其实有很多的解决方案,其本质就是设置响应头中的内容Access-Control-Allow-Origin的值,他的值其实就是我们上面允许访问的域,对此我们只需要配置响应的响应头,所以我们可以通过过滤器去设置响应头,货值配置Spring帮我们写好的过滤

手写过滤器

我们写一个类是实现Filter接口,因为pythonFilter接口中,初始化和销毁方法是默认实现,我们这里也不需要,所以没有进行重写。

public class CrossOriginFilter implements Filter {
  
  @Override
  public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    // 转化响应
    HttpServletResponse response = (HttpServletResponse) servletResponse;
    // 设置响应头,设置允许访问为全部
    response.setHeader("Access-Control-Allow-Origin", "*");
    // 放行
    filterChain.doFilter(servletRequest, response);
  }
}

Tips:

  • 过滤器写好以后,我们把它配置到项目中即可,可以使用web.XML或者Java类的方式配置,具体方式可以参考之前的配置过滤器

配置Spring配置文件

在多数的情况下,我们是不需要去手写过滤器,Spring已经帮我们做好了,而且功能也比我们的完善,我们可以直接拿过来用

<!--配置mvc的跨域访问-->
<mvc:cors>
  <!--
    映射中对应的就是我们的请求url,配置哪一条允许跨域访问
    allowed-origins  =>允许访问的请求
    allowed-methods  =>允许访问的方式
    max-age          =>预检请求缓存时间
    -->
  <mvc:mapping path="/restjs/**" allowed-origins="*" allowed-methods="POST" max-age="1888"/>
</mvc:cors>

Tips:

  • path中,如果写成/rest/*的话表示rest下面的子代请求,不会去请求到孙子代,比如/rest/test/test2是请求不到的
  • 如果写成/rest/**的话表示rest下面的所有后代的请求,比如/rest/test/test2是可以请求到的

配置JavaConfig

使用Java类来进行配置其实也是大同小异,而且在WebMvcConfig接口中,已经为我们提供了对应的方法addCorsMappings,我们只需要重新该方法即可。

@Override
public void addCorsMappings(CorsRegistry registry) {
  /*
     * 在注册处添加Mappiwww.chinasem.cnng,参数值就是对应配置文件里面path
     * 然后就可以一直去点,对应的配置xml里面的属性
     */
  registry.addandroidMapping("/rest/**")
          .allowedOrigins("*")
          .allowedMethods("POST")
          .maxAge(1811);
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持China编程(www.chinasem.cn)。

这篇关于Spring MVC跨域问题及解决的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153721

相关文章

Java中Map的五种遍历方式实现与对比

《Java中Map的五种遍历方式实现与对比》其实Map遍历藏着多种玩法,有的优雅简洁,有的性能拉满,今天咱们盘一盘这些进阶偏基础的遍历方式,告别重复又臃肿的代码,感兴趣的小伙伴可以了解下... 目录一、先搞懂:Map遍历的核心目标二、几种遍历方式的对比1. 传统EntrySet遍历(最通用)2. Lambd

Spring Boot 中 RestTemplate 的核心用法指南

《SpringBoot中RestTemplate的核心用法指南》本文详细介绍了RestTemplate的使用,包括基础用法、进阶配置技巧、实战案例以及最佳实践建议,通过一个腾讯地图路线规划的案... 目录一、环境准备二、基础用法全解析1. GET 请求的三种姿势2. POST 请求深度实践三、进阶配置技巧1

springboot+redis实现订单过期(超时取消)功能的方法详解

《springboot+redis实现订单过期(超时取消)功能的方法详解》在SpringBoot中使用Redis实现订单过期(超时取消)功能,有多种成熟方案,本文为大家整理了几个详细方法,文中的示例代... 目录一、Redis键过期回调方案(推荐)1. 配置Redis监听器2. 监听键过期事件3. Redi

Spring Boot 处理带文件表单的方式汇总

《SpringBoot处理带文件表单的方式汇总》本文详细介绍了六种处理文件上传的方式,包括@RequestParam、@RequestPart、@ModelAttribute、@ModelAttr... 目录方式 1:@RequestParam接收文件后端代码前端代码特点方式 2:@RequestPart接

SpringBoot整合Zuul全过程

《SpringBoot整合Zuul全过程》Zuul网关是微服务架构中的重要组件,具备统一入口、鉴权校验、动态路由等功能,它通过配置文件进行灵活的路由和过滤器设置,支持Hystrix进行容错处理,还提供... 目录Zuul网关的作用Zuul网关的应用1、网关访问方式2、网关依赖注入3、网关启动器4、网关全局变

SpringBoot全局异常拦截与自定义错误页面实现过程解读

《SpringBoot全局异常拦截与自定义错误页面实现过程解读》本文介绍了SpringBoot中全局异常拦截与自定义错误页面的实现方法,包括异常的分类、SpringBoot默认异常处理机制、全局异常拦... 目录一、引言二、Spring Boot异常处理基础2.1 异常的分类2.2 Spring Boot默

基于SpringBoot实现分布式锁的三种方法

《基于SpringBoot实现分布式锁的三种方法》这篇文章主要为大家详细介绍了基于SpringBoot实现分布式锁的三种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、基于Redis原生命令实现分布式锁1. 基础版Redis分布式锁2. 可重入锁实现二、使用Redisso

SpringBoot的全局异常拦截实践过程

《SpringBoot的全局异常拦截实践过程》SpringBoot中使用@ControllerAdvice和@ExceptionHandler实现全局异常拦截,@RestControllerAdvic... 目录@RestControllerAdvice@ResponseStatus(...)@Except

Springboot配置文件相关语法及读取方式详解

《Springboot配置文件相关语法及读取方式详解》本文主要介绍了SpringBoot中的两种配置文件形式,即.properties文件和.yml/.yaml文件,详细讲解了这两种文件的语法和读取方... 目录配置文件的形式语法1、key-value形式2、数组形式读取方式1、通过@value注解2、通过

Java 接口定义变量的示例代码

《Java接口定义变量的示例代码》文章介绍了Java接口中的变量和方法,接口中的变量必须是publicstaticfinal的,用于定义常量,而方法默认是publicabstract的,必须由实现类... 在 Java 中,接口是一种抽象类型,用于定义类必须实现的方法。接口可以包含常量和方法,但不能包含实例