当前位置: 代码网 > it编程>编程语言>Java > Spring MVC跨域问题及解决

Spring MVC跨域问题及解决

2025年03月12日 Java 我要评论
跨域问题不同的域协议、域名、端口,三者只要有一个不同,就叫不同的域比如:从http:/moon.com/test去拉取下列url对应的资源url是否跨域http:/moon.com/test不算跨域h

跨域问题

不同的域

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

比如

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();
  student.setname("get晓龙");
  student.setage(23);
  student.setbirthday(new date());
  return student;
}

tips:

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

4.全局解决方法

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

手写过滤器

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

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="/rest/**" 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) {
  /*
     * 在注册处添加mapping,参数值就是对应配置文件里面path
     * 然后就可以一直去点,对应的配置xml里面的属性
     */
  registry.addmapping("/rest/**")
          .allowedorigins("*")
          .allowedmethods("post")
          .maxage(1811);
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com