SpringBoot整合Web之CORS支持與配置類和 XML配置及注冊攔截器
本章概要
- 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)文章
MyBatis使用<foreach>標簽like查詢報錯解決問題
這篇文章主要介紹了MyBatis使用<foreach>標簽like查詢報錯解決問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-03-03
java集合Collection實現(xiàn)類解析ArrayList?LinkedList及Vector
這篇文章主要為大家介紹了java集合Collection實現(xiàn)類解析ArrayList?LinkedList及Vector,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-03-03
springboot實現(xiàn)執(zhí)行sql語句打印到控制臺
這篇文章主要介紹了springboot實現(xiàn)執(zhí)行sql語句打印到控制臺的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
Java中字符串轉(zhuǎn)int數(shù)據(jù)類型的三種方式
這篇文章主要介紹了Java中字符串轉(zhuǎn)int數(shù)據(jù)類型的三種方式,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03

