springboot(CORS 與 Swagger)
文章目錄
Springboot中如何處理跨域請求
一. 什麼是跨域?
我們知道Url的一般格式:協議 + 域名 + 埠號 + 資源地址
比如:
http://www.taobao.com:8080/index 是由 http + www + tabbao.com + 8080 + index 組成
只要協議,域名,埠號相同 就說明是同域(同源策略) ,有一項不同就認為是不同域,不同域之間互相訪問資源,就被稱為 跨域
而我們瀏覽器預設是不允許跨域請求的,因為他們都使用了同源策略,同源策略是由Netscape提出的一個著名的安全策略,他是瀏覽器最核心的也是最基本的安全功能,現在所有支援JavaScript的瀏覽器都會使用這個策略
但在我們實際開發中,由於各種原因又經常有跨域的需求,比如:現在的前端開發都是前後端分離的開發模式,資料的獲取並非同源;或者A網站的電子商務管理訂單,B網站是進銷存抓取資訊後做發貨;再比如做單點登入,在A網站登入後,跳轉到B網站是不需要在輸入使用者密碼了
如何實現跨域訪問呢?
二 . 什麼是CORS?
解決跨域請求:主要有JSONP ,iframe,window.name, CORS等方式。其中CORS方式是最常用的跨域實現方式,而且對各種請求方法,各種資料請求型別都是完美支援的
跨域資源共享(CORS ,Cross-orgin resource sharing)是一種機制,它使用的額外的HTTP頭來告訴瀏覽器讓執行在一個origin(domain)上的Web應用被准許訪問來自不同源伺服器上的指定的資源。當一個資源從與該資源本身所在的伺服器不同的域,協議,或介面請求一個資源時,資源會發起一個跨域的http請求。
原理: 在伺服器端設定允許跨域的請求頭,從而實現跨域,服務端設定後 前端通過正常的ajax請求即可
三. Springboot中CROS請求的使用
第一種方式:在被請求的方法的一方加上註解 @CrossOrigin(“允許請求的域名”)(例如 :@CrossOrigin(“http://localhost:8090”))
程式碼如下:
第一個springboot專案,修改其埠為 8090
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<button id="cros" value="發起跨域請求">發起跨域請求</button>
<script src="http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script>
<script>
$("#cros").click(function () {
$.ajax({
type:"get",
url:"http://localhost:8080/student",
data:{},
dataType:"json",
success:function (data) {
console.log(data)
}
})
})
</script>
</body>
</html>
第二個springboot專案,設定允許訪問的域
@Controller
public class StudentController {
@Autowired
private IStudentService studentService;
@CrossOrigin("http://localhost:8090")
@RequestMapping("/student")
@ResponseBody
public List<Student> selectAll(){
return studentService.selectAll();
}
}
遇到的問題: 在控制層中 有多個Controller類 ,並且有多個方法,解決:使用配置檔案
第二種方式:配置 java 類 交由springboot進行管理
@Configuration
public class ProviderMvcConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") // 專案中所有介面都支援跨域
.allowedOrigins("http://localhost:8090") // 允許那些域訪問我們的跨域資源
.allowedMethods("*") // 允許的訪問方法 Post , Get ,Put , OPTIOINS ,DELETE
.allowedHeaders("*"); // 允許所有請求的header 訪問,可以自定義設定任意請求頭
}
}
SpringBoot 整合Swagger2 線上文件
一. 什麼是swagger?
建立Restful風格的API介面,供第三方或前端人員使用,那麼前端人員在使用過程中怎樣知道有哪些介面呢。這個時候就需要通過寫介面文件來解決,但不同程式設計師寫出來的可能不一樣。swagger 就是介面文件生成工具
Swagger?
Swagger 是一款開源工具,依據OpneAPI規範(OpneAPI Specification,簡稱OAS)可以幫助設計構建 生成文件,呼叫Rest APIS。
二.Springboot中如何整合Swagger2
-
正常建立springboot專案
-
新增swagger2相關jar包
<!-- swagger 2 核心依賴--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <!-- swagger-ui 依賴 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency>
3.在xxxApplication啟動類上加入註解:@EnableSwagger2
然後啟動專案:訪問http://localhost:8080/swagger-ui.html 就 ok了 這裡使用的是預設的ip 和 埠號
頁面有些簡陋,並且功能不全
-
簡單配置頁面
建立配置類
@Configuration public class Swagger2 { /* 我們可以瞭解到,我們把一個Docket類的一個例項新增到Spring的 BeanFactory中 以實現Swagger頁面一些展示資訊的定製化,例如作者,標題,描述等資訊, 也可以進行一些響應的配置項,例如掃描的Controller類基礎包名等等。 swagger會在初始化時從Spring的 BeanFactory中獲取該例項(如果沒有則使用預設的Docket例項), 來完成初始化。 */ @Bean public Docket docket() { return new Docket(DocumentationType.SWAGGER_2).apiInfo( new ApiInfoBuilder() .contact(new Contact("zhj", "", "[email protected]")) .title("Title") .build() ); } } -
說明
-
描述控制層的類 :@Api("")
-
描述控制層類裡的方法:@ApiIOperation("")
-
描述控制層類方法只有一個的引數:@ApiImplicitParam(name, value,requried=true)
-
描述控制層類方法多個的引數:@ApiImplicitParams({name, value,requried=true})
-
描述傳遞的domain物件引數:
描述domain類:@ApiModel(descption)
描述屬性:@ApiModelPropetty(name, value,example[,require=true])
