1. 程式人生 >實用技巧 >其它 >springboot(CORS 與 Swagger)

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

  1. 正常建立springboot專案

  2. 新增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 和 埠號

頁面有些簡陋,並且功能不全

  1. 簡單配置頁面

    建立配置類

    @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()
            );
        }
    }
    
  2. 說明

  • 描述控制層的類 :@Api("")

  • 描述控制層類裡的方法:@ApiIOperation("")

  • 描述控制層類方法只有一個的引數:@ApiImplicitParam(name, value,requried=true)

  • 描述控制層類方法多個的引數:@ApiImplicitParams({name, value,requried=true})

  • 描述傳遞的domain物件引數:

    描述domain類:@ApiModel(descption)

    描述屬性:@ApiModelPropetty(name, value,example[,require=true])