您好,欢迎访问一九零五行业门户网

Spring Boot实现跨域的方式有哪些

一、为什么会出现跨域问题出于浏览器的同源策略限制。同源策略(sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。web是基于同源策略建立的,浏览器只是实现同源策略的一种方式。
在javascript中,同源策略将限制不同域之间的交互,防止跨域的攻击。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)
二、什么是跨域当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域
三、非同源限制无法读取非同源网页的 cookie、localstorage 和 indexeddb
无法接触非同源网页的 dom
无法向非同源地址发送 ajax 请求
四、java后端实现cors跨域请求的方式对于 cors的跨域请求,主要有以下几种方式可供选择:
返回新的corsfilter
重写 webmvcconfigurer
使用注解 @crossorigin
手动设置响应头 (httpservletresponse)
自定 web filter 实现跨域
注意:
corfilter / webmvconfigurer / @crossorigin 需要 springmvc 4.2以上版本才支持,对应springboot 1.3版本以上
前面两种方法是全局cors配置,而后面两种是局部cors配置。如果使用了局部跨域是会覆盖全局跨域的规则,所以可以通过 @crossorigin 注解来进行细粒度更高的跨域资源控制。
其实无论哪种方案,最终目的都是修改响应头,向响应头中添加浏览器所要求的数据,进而实现跨域
1. 返回新的corsfilter(全局跨域)在任意配置类,返回一个 新的 corsfilter bean ,并添加映射路径和具体的cors配置路径。
@configurationpublic class globalcorsconfig { @bean public corsfilter corsfilter() { //1. 添加 cors配置信息 corsconfiguration config = new corsconfiguration(); //放行哪些原始域 config.addallowedorigin("*"); //是否发送 cookie config.setallowcredentials(true); //放行哪些请求方式 config.addallowedmethod("*"); //放行哪些原始请求头部信息 config.addallowedheader("*"); //暴露哪些头部信息 config.addexposedheader("*"); //2. 添加映射路径 urlbasedcorsconfigurationsource corsconfigurationsource = new urlbasedcorsconfigurationsource(); corsconfigurationsource.registercorsconfiguration("/**",config); //3. 返回新的corsfilter return new corsfilter(corsconfigurationsource); }}
2. 重写webmvcconfigurer(全局跨域)@configurationpublic class corsconfig implements webmvcconfigurer { @override public void addcorsmappings(corsregistry registry) { registry.addmapping("/**") //是否发送cookie .allowcredentials(true) //放行哪些原始域 .allowedorigins("*") .allowedmethods(new string[]{"get", "post", "put", "delete"}) .allowedheaders("*") .exposedheaders("*"); }}
3. 使用注解 (局部跨域)在控制器(类上)上使用注解 @crossorigin:,表示该类的所有方法允许跨域。
@restcontroller@crossorigin(origins = "*")public class hellocontroller { @requestmapping("/hello") public string hello() { return "hello world"; }}
在方法上使用注解 @crossorigin:
@requestmapping("/hello") @crossorigin(origins = "*") //@crossorigin(value = "http://localhost:8081") //指定具体ip允许跨域 public string hello() { return "hello world"; }
4. 手动设置响应头(局部跨域)使用 httpservletresponse 对象添加响应头(access-control-allow-origin)来授权原始域,这里 origin的值也可以设置为 “*”,表示全部放行。
@requestmapping("/index")public string index(httpservletresponse response) { response.addheader("access-allow-control-origin","*"); return "index";}
5. 使用自定义filter实现跨域首先编写一个过滤器,可以起名字为mycorsfilter.java
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;@componentpublic 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() {}}
在web.xml中配置这个过滤器,使其生效
<!-- 跨域访问 start--><filter> <filter-name>corsfilter</filter-name> <filter-class>com.mesnac.aop.mycorsfilter</filter-class></filter><filter-mapping> <filter-name>corsfilter</filter-name> <url-pattern>/*</url-pattern></filter-mapping><!-- 跨域访问 end -->
以上就是spring boot实现跨域的方式有哪些的详细内容。
其它类似信息

推荐信息