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