最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot整合Web之CORS支持與配置類和 XML配置及注冊攔截器

 更新時間:2022年08月15日 09:24:30   作者:一只小熊貓呀  
這篇文章主要介紹了SpringBoot整合Web開發(fā)中CORS支持與配置類和 XML配置及注冊攔截器的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧

本章概要

  • CORS 支持
  • 配置類與 XML 配置
  • 注冊攔截器

CORS 支持

CORS (Cross-Origin Resource Sharing)是由 W3C 制定開發(fā)的一種跨域資源共享技術(shù)標準,其目的就是為了解決前端的跨域請求。在 Java EE 開發(fā)中,最常見的前端跨域請求解決方案是 JSONP ,但是 JSONP 只支持 GET 請求,而 CORS 則支持多種 HTTP 請求方法。

GET、POST、HEAD 請求流程:響應(yīng)頭中有一個 Access-Control-Orgin 字段,用來記錄可以訪問該資源的域。當瀏覽器收到這樣的響應(yīng)頭信息后,提取 Access-Control-Orgin 字段中的值,發(fā)現(xiàn)該值包含當前頁面所在的域,就知道這個跨域是被允許的。

DELETE、PUT 及 自定義請求等請求流程:以 DELETE 請求為例,當前端發(fā)起一個 DELETE 請求時,這個請求的處理會經(jīng)過兩個步驟。第一步,發(fā)送一個 OPTIONS 請求詢問服務(wù)端是否具備該資源的 DELETE 權(quán)限,服務(wù)端給瀏覽器響應(yīng), Allow 頭信息表示服務(wù)端支持的請求方法。第二步,發(fā)送 DELETE 請求,服務(wù)端再次給出一次響應(yīng)。

無論是簡單請求還是自定義請求,前端的寫法都不變,額外的處理都是在服務(wù)端來完成的。在傳統(tǒng) Java EE 開發(fā)中,可以通過過濾器統(tǒng)一配置,而 Spring Boot 中對此則提供了更簡潔的解決方案。

1. 創(chuàng)建SpringBoot工程

創(chuàng)建 Spring Boot 工程,添加 Web 依賴,如下

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>

2. 創(chuàng)建控制器

@RestController
@RequestMapping("/book")
public class BookController {
    @PostMapping("/")
    public String addBook(String name){
        return "receive:"+name;
    }
    @DeleteMapping("/{id}")
    public String deleteBookById(@PathVariable long id){
        return String.valueOf(id);
    }
}

3. 配置跨域

跨域有兩個地方可以配置,一個是直接在相應(yīng)的請求方法上加注解:

@RestController
@RequestMapping("/book")
public class BookController {
    @PostMapping("/")
    @CrossOrigin(value = "http://localhost:8081",maxAge = 1800,allowedHeaders = "*")
    public String addBook(String name){
        return "receive:"+name;
    }
    @DeleteMapping("/{id}")
    @CrossOrigin(value = "http://localhost:8081",maxAge = 1800,allowedHeaders = "*")
    public String deleteBookById(@PathVariable long id){
        return String.valueOf(id);
    }
}

代碼解釋:

  • @CrossOrigin 中的 value 表示支持的域,這里表示來自 http://localhost:8081 域的請求是支持跨域的
  • maxAge 表示探測請求的有效期,探測請求不用每次都發(fā)送,可以配置一個有效期,有效期過了之后才會發(fā)送探測請求,默認1800秒
  • allowedHeaders 表示允許的請求頭,“*” 表示所有的請求頭都被允許

這種配置方式是一種細粒度的配置,可以控制到每一個方法上。也可以不再每個方法上加 @CrossOrigin 注解,而是采用全局配置,如下:

@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/book/**")
                .allowedHeaders("*")
                .allowedMethods("*")
                .maxAge(1800)
                .allowedOrigins("http://localhost:8081");
        System.out.println("進入跨域配置");
    }
}

代碼解釋:

  • 全局配置需要自定義實現(xiàn) WebMvcConfigurer 接口,然后實現(xiàn)接口中的 addCorsMappings 方法
  • 在 addCorsMappings 方法中,addMapping 表示對哪種格式的請求路徑進行跨域處理;allowedHeaders 表示允許的請求頭,默認允許所有的請求頭信息;allowedMethods表示允許的請求方法,默認是 GET 、POST 和 HEAD , * 表示支持所有的請求方法; maxAge表示探測請求的有效期;allowedOrigins表示支持的域

上面兩種配置方式,選擇一種即可,然后啟動項目。

4. 測試

新建一個Spring Boot 項目,添加Web依賴,然后在 resources/static 目錄下加入jquery.js并創(chuàng)建一個index.html文件,如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="jquery3.3.1.js"></script>
</head>
<body>
<div id="contentDiv"></div>
<div id="deleteResult"></div>
<input type="button" value="提交數(shù)據(jù)" onclick="getData()"><br>
<input type="button" value="刪除數(shù)據(jù)" onclick="deleteData()"><br>
<script>
    function getData() {
        $.ajax({
            url: 'http://localhost:8081/book/',
            type: 'get',
            success: function (msg) {
                $("#contentDiv").html(msg);
            }
        })
    }
    function deleteData() {
        $.ajax({
            url: 'http://localhost:8081/book/99',
            type: 'delete',
            success: function (msg) {
                $("#deleteResult").html(msg);
            }
        })
    }
</script>
</body>
</html>

運行項目,訪問"http://localhost:8081/index.html",查看結(jié)果

配置類與 XML 配置

Spring Boot 推薦使用 Java 完成相關(guān)的配置工作。在項目中,不建議將所有的配置放在一個配置類中,可以根據(jù)不同的需求提供不同的配置類,例如專門處理Spring Security 的配置類、提供 Bean 的配置類、Spring MVC 相關(guān)的配置類。這些配置上都需要添加 @Configuration,@ComponentScan 注解會掃描所有的 Spring 組件,也包括 @Configuration 。@ComponentScan注解 在項目入口類的 @SpringBootApplication 注解中已經(jīng)提供,因此在實際項目中只需要按需提供相關(guān)配置類即可。

Spring Boot 中并不推薦使用 XML配置。如果需要使用 XML 配置,只需要在 resources 目錄下提供配置文件 然后通過 @ImportResource 加載配置文件即可,例如,有一個 Hello 類,如下:

public class Hello {
    public String sayHello(String name){
        return "hello" + name;
    }
}

在resources 目錄下新建 beans.xml 文件配置該類:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean class="com.sang.chapter04.Hello" id="hello"/>
</beans>

然后創(chuàng)建 Bean 配置類,導(dǎo)入 XML 配置

@Configuration
@ImportResource("classpath:beans.xml")
public class Beans {
}

最后在 Controller 中就可以直接導(dǎo)入 Hello 類使用了:

@RestController
public class HelloController {
    @Autowired
    Hello hello;
    @GetMapping("/hello")
    public String hello(){
        return hello.sayHello("嗨嘍!");
    }
}

注冊攔截器

Spring Boot 中提供了 AOP 風格的攔截器,擁有更加精細的攔截處理能力。Spring Boot 中攔截器的注冊更加方便。

步驟1:創(chuàng)建一個 Spring Boot 項目,添加 spring-boot-starter-web 依賴。

步驟2:創(chuàng)建攔截器實現(xiàn) HandlerInterceptor 接口

public class MyInterceptor1 implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        System.out.println("MyInterceptor1>>>preHandle");
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        System.out.println("MyInterceptor1>>>postHandle");
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        System.out.println("MyInterceptor1>>>afterCompletion");
    }
}

攔截器中的方法將按 preHandle --> Controller --> postHandle --> afterCompletion 的順序執(zhí)行。注意,只有 preHandle 方法返回 true 時后面的方法才會執(zhí)行。當攔截器鏈內(nèi)存在多個攔截攔截器時,postHandle 在攔截器鏈內(nèi)的所有的攔截器返回成功時才會調(diào)用,而 afterCompletion 只有 preHandle 返回 true 才會調(diào)用,若攔截器鏈內(nèi)的第一個攔截器的 preHandle 方法返回 false ,則后面的方法都不會執(zhí)行。

步驟3:配置攔截器。定義配置類進行攔截器的配置,如下

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyInterceptor1())
                .addPathPatterns("/**")
                .excludePathPatterns("/hello");
    }
}

自定義實現(xiàn) WebMvcConfigurer 接口,實現(xiàn)接口中的 addInterceptors 方法。其中,addPathPatterns表示攔截路徑,excludePathPatterns 表示排除的路徑。

步驟4:測試。在瀏覽器中訪問 /hello 和 /hello2 接口,當訪問 /hello2 時,打印日志如下:

MyInterceptor1>>>preHandle
MyInterceptor1>>>postHandle
MyInterceptor1>>>afterCompletion

到此這篇關(guān)于SpringBoot整合Web之CORS支持與配置類和 XML配置及注冊攔截器的文章就介紹到這了,更多相關(guān)SpringBoot CORS支持內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解如何熟練使用java函數(shù)式接口

    詳解如何熟練使用java函數(shù)式接口

    最近剛好有空給大家整理下JDK8的特性,這個在實際開發(fā)中的作用也是越來越重了,本文重點講解下函數(shù)式接口內(nèi)容,需要的朋友可以參考下
    2021-06-06
  • 在SpringBoot中該如何配置攔截器

    在SpringBoot中該如何配置攔截器

    今天給大家?guī)淼氖顷P(guān)于SpringBoot的相關(guān)知識,文章圍繞在SpringBoot中該如何配置攔截器展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Java synchronized與CAS使用方式詳解

    Java synchronized與CAS使用方式詳解

    提到Java的知識點一定會有多線程,JDK版本不斷的更迭很多新的概念和方法也都響應(yīng)提出,但是多線程和線程安全一直是一個重要的關(guān)注點。比如說我們一入門就學(xué)習的synchronized怎么個實現(xiàn)和原理,還有總是被提到的CAS是啥,他和synchronized關(guān)系是啥?請往下看
    2023-01-01
  • Filter在springboot中的使用方法詳解

    Filter在springboot中的使用方法詳解

    這篇文章主要介紹了Filter在springboot中的使用方法詳解,filter(過濾器)作用于在intreceptor(攔截器)之前,不像intreceptor一樣依賴于springmvc框架,只需要依賴于serverlet,需要的朋友可以參考下
    2023-08-08
  • spring event 事件異步處理方式(發(fā)布,監(jiān)聽,異步處理)

    spring event 事件異步處理方式(發(fā)布,監(jiān)聽,異步處理)

    這篇文章主要介紹了spring event 事件異步處理方式(發(fā)布,監(jiān)聽,異步處理),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Spring?Boot如何實現(xiàn)統(tǒng)一數(shù)據(jù)返回

    Spring?Boot如何實現(xiàn)統(tǒng)一數(shù)據(jù)返回

    這篇文章主要介紹了Spring?Boot如何實現(xiàn)統(tǒng)一數(shù)據(jù)返回,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • mybatis的mapper.xml中resultMap標簽的使用詳解

    mybatis的mapper.xml中resultMap標簽的使用詳解

    這篇文章主要介紹了mybatis的mapper.xml中resultMap標簽的使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2020-06-06
  • Java 進制轉(zhuǎn)換的方法

    Java 進制轉(zhuǎn)換的方法

    這篇文章介紹了Java 進制轉(zhuǎn)換的方法,有需要的朋友可以參考一下
    2013-09-09
  • 實例講解Java并發(fā)編程之變量

    實例講解Java并發(fā)編程之變量

    這篇文章主要介紹了實例講解Java并發(fā)編程之變量,本文講解了編寫線程安全需要關(guān)心的共享變量和可變變量,需要的朋友可以參考下
    2015-04-04
  • Java使用JDBC連接數(shù)據(jù)庫的詳細步驟

    Java使用JDBC連接數(shù)據(jù)庫的詳細步驟

    本文詳細講解了Java使用JDBC連接數(shù)據(jù)庫的詳細步驟,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2022-01-01

最新評論

贵定县| 防城港市| 鄂伦春自治旗| 贵德县| 马公市| 常熟市| 池州市| 石阡县| 岗巴县| 永宁县| 新巴尔虎右旗| 丽江市| 中山市| 老河口市| 张掖市| 两当县| 阆中市| 汶川县| 仁化县| 霞浦县| 家居| 旬邑县| 阳东县| 潞城市| 福清市| 伽师县| 鹿邑县| 房产| 海南省| 建湖县| 来凤县| 洱源县| 洪洞县| 邯郸市| 南京市| 磴口县| 通山县| 桐梓县| 天峻县| 文安县| 大丰市|