日常提交

This commit is contained in:
2023-01-04 00:15:10 +08:00
parent 9ffa6b3eab
commit a6b6032921

View File

@@ -652,3 +652,88 @@ public class ExampleAdvice2 {}
public class ExampleAdvice3 {} public class ExampleAdvice3 {}
``` ```
## CORS
Spring MVC允许处理跨域问题。
> ### 跨域问题
> 处于对安全的考虑浏览器禁止ajax访问非当前origin的资源。
> 对于简单请求浏览器会直接通过请求和响应中特定header来判断当前资源是否能够被访问对于非简单请求则是在请求之前会发送一个预检请求OPTIONS请求判断当前资源能否被访问
在Spring MVC中HandlerMapping实现提供了对CORS的支持。在实际将一个请求映射到handler后HandlerMapping实现将会检查请求和handler的CORS配置并且做进一步的处理。
如果想要启用CORS需要显式声明CORS配置如果匹配的CORS配置未被找到那么预检请求将会被拒绝。CORS header将不会添加到简单请求和实际CORS请求的响应中浏览器将会拒绝没有CORS header的响应
### @CrossOrigin
可以对handler method使用@CrossOrigin注解以允许跨域请求,使用示例如下:
```java
@RestController
@RequestMapping("/account")
public class AccountController {
@CrossOrigin
@GetMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@DeleteMapping("/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}
```
默认情况下,@CrossOrigin会允许来自所有origin、含有任意header和所有http method。
- allowCredentials默认情况下没有启用除非allowOrigins或allowOriginPatterns被指定了一个非"*"的值。
- maxAge默认会设置为30min
@CrossOrigin注解支持在类上使用,类上注解会被方法继承
```java
@CrossOrigin(origins = "https://domain2.com", maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {
@GetMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@DeleteMapping("/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}
```
@CrossOrigin注解可同时在类和方法上使用
```java
@CrossOrigin(maxAge = 3600)
@RestController
@RequestMapping("/account")
public class AccountController {
@CrossOrigin("https://domain2.com")
@GetMapping("/{id}")
public Account retrieve(@PathVariable Long id) {
// ...
}
@DeleteMapping("/{id}")
public void remove(@PathVariable Long id) {
// ...
}
}
```
### spring boot全局配置CORS
在spring boot中可以通过如下方式全局配置CORS
```java
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("http://localhost:4200")
.allowedMethods("*")
.allowedHeaders("*")
.allowCredentials(false)
.maxAge(3600);
}
}
```