本文主要是介绍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
接口,因为python在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:
配置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); }
总结
这篇关于Spring MVC跨域问题及解决的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!