javascript
后端技术:SpringBoot 中实现跨域的5种方式
作者:ratelfu
blog.csdn.net/weter_drop/article/details/112135940
一、為什么會出現跨域問題
出于瀏覽器的同源策略限制。同源策略(Sameoriginpolicy)是一種約定,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,則瀏覽器的正常功能可能都會受到影響。可以說Web是構建在同源策略基礎之上的,瀏覽器只是針對同源策略的一種實現。
同源策略會阻止一個域的javascript腳本和另外一個域的內容進行交互。所謂同源(即指在同一個域)就是兩個頁面具有相同的協議(protocol),主機(host)和端口號(port)
二、什么是跨域
當一個請求url的協議、域名、端口三者之間任意一個與當前頁面url不同即為跨域
三、非同源限制
【1】無法讀取非同源網頁的 Cookie、LocalStorage 和 IndexedDB
【2】無法接觸非同源網頁的 DOM
【3】無法向非同源地址發送 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配置路徑。
@Configuration public?class?GlobalCorsConfig?{@Beanpublic?CorsFilter?corsFilter()?{//1.?添加?CORS配置信息CorsConfiguration?config?=?new?CorsConfiguration();//放行哪些原始域config.addAllowedOrigin("*");//是否發送?Cookieconfig.setAllowCredentials(true);//放行哪些請求方式config.addAllowedMethod("*");//放行哪些原始請求頭部信息config.addAllowedHeader("*");//暴露哪些頭部信息config.addExposedHeader("*");//2.?添加映射路徑UrlBasedCorsConfigurationSource?corsConfigurationSource?=?new?UrlBasedCorsConfigurationSource();corsConfigurationSource.registerCorsConfiguration("/**",config);//3.?返回新的CorsFilterreturn?new?CorsFilter(corsConfigurationSource);} }2. 重寫 WebMvcConfigurer(全局跨域)
@Configuration public?class?CorsConfig?implements?WebMvcConfigurer?{@Overridepublic?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的值也可以設置為 “*”,表示全部放行。推薦:150道常見的Java面試題分解匯總
@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; @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()?{} }在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??-->五、 參考連接
https://blog.csdn.net/pjmike233/article/details/82461911
https://blog.csdn.net/zlbdmm/article/details/105853736
https://www.cnblogs.com/lenve/p/11724463.html
IT技術分享社區
個人博客網站:https://programmerblog.xyz
文章推薦程序員效率:畫流程圖常用的工具程序員效率:整理常用的在線筆記軟件遠程辦公:常用的遠程協助軟件,你都知道嗎?51單片機程序下載、ISP及串口基礎知識硬件:斷路器、接觸器、繼電器基礎知識
總結
以上是生活随笔為你收集整理的后端技术:SpringBoot 中实现跨域的5种方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小甲鱼python课后题007_[Pyt
- 下一篇: 电信提供的路由器无法进入配置地址或者配置