日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

后端技术:SpringBoot 中实现跨域的5种方式

發布時間:2023/12/10 javascript 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 后端技术: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种方式的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。