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", "", "2414680855@qq.com"))
                            .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])

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值