欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring?MVC跨域問(wèn)題及解決

 更新時(shí)間:2025年03月12日 16:31:01   作者:`moon`曉龍  
這篇文章主要介紹了Spring?MVC跨域問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

跨域問(wèn)題

不同的域

協(xié)議、域名、端口,三者只要有一個(gè)不同,就叫不同的域

比如

http:/moon.com/test去拉取下列url對(duì)應(yīng)的資源

URL是否跨域
http:/moon.com/test不算跨域
http:/www.moon.com/test算跨域
https:/moon.com/test算跨域

Tips:

  • 不同的域?qū)?strong>協(xié)議、域名端口三者的檢查是非常嚴(yán)格的,比如從http://localhost:8080/test去拉取http://127.0.0.1:8080/test2算跨域的,因?yàn)橛蛎灰粯?,雖然他們表達(dá)的意思一樣。

同源策略

瀏覽器自身會(huì)組織從一個(gè)域加載的腳本獲取另外一個(gè)域的資源

Tips:

  • 對(duì)于css和js這樣的資源是不會(huì)觸發(fā)同源策略

解決方法

1.CORS

跨域資源共享,因?yàn)樗С炙蓄?lèi)型的HTTP請(qǐng)求

Tips:

  • 只能解決瀏覽器跨域問(wèn)題,如果涉及到App,小程序,物聯(lián)網(wǎng)設(shè)備跨域,SpringMVC這一套不一定生效

2.JSONP

前端可以通過(guò)JSONP來(lái)進(jìn)行獲取跨域資源,但是只支持GET請(qǐng)求

3.局部解決方案

@CrossOrigin

在方法或者類(lèi)上加上@CrossOrigin這個(gè)注解,設(shè)置響應(yīng)頭中允許的跨域訪問(wèn)的請(qǐng)求域,*代表所有,也可以通過(guò)字符串?dāng)?shù)組的形式進(jìn)行逐一放行

@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屬性表示預(yù)檢請(qǐng)求結(jié)果緩存的最大時(shí)長(zhǎng),單位為秒,默認(rèn)為1800s,即30分鐘

4.全局解決方法

對(duì)于瀏覽器的跨域問(wèn)題,其實(shí)有很多的解決方案,其本質(zhì)就是設(shè)置響應(yīng)頭中的內(nèi)容Access-Control-Allow-Origin的值,他的值其實(shí)就是我們上面允許訪問(wèn)的域,對(duì)此我們只需要配置響應(yīng)的響應(yīng)頭,所以我們可以通過(guò)過(guò)濾器去設(shè)置響應(yīng)頭,貨值配置Spring幫我們寫(xiě)好的過(guò)濾

手寫(xiě)過(guò)濾器

我們寫(xiě)一個(gè)類(lèi)是實(shí)現(xiàn)Filter接口,因?yàn)樵?code>Filter接口中,初始化和銷(xiāo)毀方法是默認(rèn)實(shí)現(xiàn),我們這里也不需要,所以沒(méi)有進(jìn)行重寫(xiě)。

public class CrossOriginFilter implements Filter {
  
  @Override
  public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    // 轉(zhuǎn)化響應(yīng)
    HttpServletResponse response = (HttpServletResponse) servletResponse;
    // 設(shè)置響應(yīng)頭,設(shè)置允許訪問(wèn)為全部
    response.setHeader("Access-Control-Allow-Origin", "*");
    // 放行
    filterChain.doFilter(servletRequest, response);
  }
}

Tips:

  • 過(guò)濾器寫(xiě)好以后,我們把它配置到項(xiàng)目中即可,可以使用web.xml或者java類(lèi)的方式配置,具體方式可以參考之前的配置過(guò)濾器

配置Spring配置文件

在多數(shù)的情況下,我們是不需要去手寫(xiě)過(guò)濾器,Spring已經(jīng)幫我們做好了,而且功能也比我們的完善,我們可以直接拿過(guò)來(lái)用

<!--配置mvc的跨域訪問(wèn)-->
<mvc:cors>
  <!--
    映射中對(duì)應(yīng)的就是我們的請(qǐng)求url,配置哪一條允許跨域訪問(wèn)
    allowed-origins  =>允許訪問(wèn)的請(qǐng)求
    allowed-methods  =>允許訪問(wèn)的方式
    max-age          =>預(yù)檢請(qǐng)求緩存時(shí)間
    -->
  <mvc:mapping path="/rest/**" allowed-origins="*" allowed-methods="POST" max-age="1888"/>
</mvc:cors>

Tips:

  • path中,如果寫(xiě)成/rest/*的話表示rest下面的子代請(qǐng)求,不會(huì)去請(qǐng)求到孫子代,比如/rest/test/test2是請(qǐng)求不到的
  • 如果寫(xiě)成/rest/**的話表示rest下面的所有后代的請(qǐng)求,比如/rest/test/test2是可以請(qǐng)求到的

配置JavaConfig

使用Java類(lèi)來(lái)進(jìn)行配置其實(shí)也是大同小異,而且在WebMvcConfig接口中,已經(jīng)為我們提供了對(duì)應(yīng)的方法addCorsMappings,我們只需要重新該方法即可。

@Override
public void addCorsMappings(CorsRegistry registry) {
  /*
     * 在注冊(cè)處添加Mapping,參數(shù)值就是對(duì)應(yīng)配置文件里面path
     * 然后就可以一直去點(diǎn),對(duì)應(yīng)的配置xml里面的屬性
     */
  registry.addMapping("/rest/**")
          .allowedOrigins("*")
          .allowedMethods("POST")
          .maxAge(1811);
}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • JavaWeb BeanUtils信息類(lèi)原理詳解

    JavaWeb BeanUtils信息類(lèi)原理詳解

    這篇文章主要介紹了JavaWeb BeanUtils信息類(lèi)原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • java正則表達(dá)式學(xué)習(xí)筆記之命名捕獲

    java正則表達(dá)式學(xué)習(xí)筆記之命名捕獲

    這篇文章主要為大家詳細(xì)介紹了java正則表達(dá)式中的命名捕獲,感興趣的小伙伴們可以參考一下
    2016-02-02
  • java如何實(shí)現(xiàn)圖片轉(zhuǎn)化為數(shù)據(jù)流

    java如何實(shí)現(xiàn)圖片轉(zhuǎn)化為數(shù)據(jù)流

    這篇文章主要介紹了java如何實(shí)現(xiàn)圖片轉(zhuǎn)化為數(shù)據(jù)流,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • java 字節(jié)流和字符流的區(qū)別詳解

    java 字節(jié)流和字符流的區(qū)別詳解

    這篇文章主要介紹了java 字節(jié)流和字符流的區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 圖文詳解Java的反射機(jī)制

    圖文詳解Java的反射機(jī)制

    反射就是Reflection,Java的反射是指程序在運(yùn)行期可以拿到一個(gè)對(duì)象的所有信息。反射機(jī)制是框架的靈魂,一個(gè)java程序員不能不會(huì)使用反射,本文就來(lái)和大家一起詳細(xì)聊聊Java的反射機(jī)制
    2022-08-08
  • springsecurity中http.permitall與web.ignoring的區(qū)別說(shuō)明

    springsecurity中http.permitall與web.ignoring的區(qū)別說(shuō)明

    這篇文章主要介紹了springsecurity中http.permitall與web.ignoring的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • java解壓jar包和壓縮jar包的簡(jiǎn)單步驟

    java解壓jar包和壓縮jar包的簡(jiǎn)單步驟

    JAR(Java Archive)是Java的歸檔文件,它是一種與平臺(tái)無(wú)關(guān)的文件格式,它允許將許多文件組合成一個(gè)壓縮文件,這篇文章主要介紹了java解壓jar包和壓縮jar包的簡(jiǎn)單步驟,需要的朋友可以參考下
    2024-12-12
  • struts2開(kāi)發(fā)流程及詳細(xì)配置

    struts2開(kāi)發(fā)流程及詳細(xì)配置

    這篇文章主要介紹了struts2開(kāi)發(fā)流程及詳細(xì)配置,步驟比較詳細(xì),具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-09-09
  • 淺談Spring Boot日志框架實(shí)踐

    淺談Spring Boot日志框架實(shí)踐

    這篇文章主要介紹了淺談Spring Boot日志框架實(shí)踐,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • SpringBoot集成Tomcat服務(wù)架構(gòu)配置

    SpringBoot集成Tomcat服務(wù)架構(gòu)配置

    這篇文章主要為大家介紹了SpringBoot集成Tomcat服務(wù)架構(gòu)配置,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02

最新評(píng)論