Spring boot处理OPTIONS请求

一、现象
从fetch说起,用fetch构造一个POST请求。

 1 fetch(‘http://127.0.0.1:8000/api/login‘, {
 2     method: "POST",
 3     headers: ({
 4         ‘Content-Type‘: ‘application/x-www-form-urlencoded‘
 5     }),
 6     body: "name=" + name + "&password=" + pwd
 7 }).then((res) = >{
 8     console.log(res.status);
 9     return res.json()
10 }).then((data) = >{
11     // console.log(data.result)
12     let loginResult = data.result
13     if (loginResult == ‘ok‘) {
14         dispatch(getSuccess(data.list)) browserHistory.push(‘/index‘)
15     } else {
16         console.log("illegal login in !")
17     }
18 }).
19 catch((e) = >{
20     console.log(e.message)
21 })

调用的API服务是Spring boot开发的。

这个POST发出去,一切正常。

由于业务需要,我增加一个头字段:Authorization。

fetch请求的代码修改如下:

 1 ...
 2
 3 headers: ({
 4     ‘Content-Type‘: ‘application/x-www-form-urlencoded‘,
 5     ‘Authorization‘: ‘1111111222‘
 6 }),
 7 body: "name=" + name + "&password=" + pwd
 8 }).then((res) = >{
 9
10 ...

问题出现了,服务器收到一个OPTIONS请求?!

二、原因

这是fetch出于安全性考虑做的一次服务器预查询,而我的服务没有做相应的处理,所以业务处理失败了。

三、解决

方法一:

网上查到的最多的说法就是:

在application.properties文件中增加这一行配置:

spring.mvc.dispatch-options-request=true

遗憾的是,我的环境配置没有生效。

方法二:

手动写一个Filter:

 0 @Component 1 public class CorsFilter implements Filter {
 2     @Override
 3     public void init(FilterConfig filterConfig) throws ServletException {
 4         // TODO Auto-generated method stub
 5     }
 6
 7     @Override
 8     public void doFilter(ServletRequest req, ServletResponse res,
 9         FilterChain chain) throws IOException, ServletException {
10         HttpServletResponse response = (HttpServletResponse) res;
11         response.setHeader("Access-Control-Allow-Origin", "*");
12         response.setHeader("Access-Control-Allow-Methods",
13             "POST, GET, OPTIONS, DELETE");
14         response.setHeader("Access-Control-Max-Age", "3600");
15         response.setHeader("Access-Control-Allow-Headers",
16             "Content-Type, x-requested-with, X-Custom-Header, Authorization");
17         chain.doFilter(req, res);
18     }
19
20     @Override
21     public void destroy() {
22         // TODO Auto-generated method stub
23     }
24 }

一点说明:

response.setHeader("Access-Control-Allow-Headers", "Content-Type, x-requested-with, X-Custom-Header, Authorization");

配置中的Authorization是和请求中自定义的头部字段是一样的。

通过这个过滤器,fetch后续的POST请求就可以顺利的发出了。

时间: 2024-08-02 02:39:50

Spring boot处理OPTIONS请求的相关文章

spring boot跨域请求访问配置以及spring security中配置失效的原理解析

一.同源策略 同源策略[same origin policy]是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源. 同源策略是浏览器安全的基石. 什么是源 源[origin]就是协议.域名和端口号.例如:http://www.baidu.com:80这个URL. 什么是同源 若地址里面的协议.域名和端口号均相同则属于同源. 是否是同源的判断 例如判断下面的URL是否与 http://www.a.com/test/index.html 同源 http://www.a

Spring Boot 简单的请求示例(包括请求体验证)

1.先做个最简单的Get请求 新建一个Controller , 并给他添加注解@RestController 它是@Controller和@ResponseBody的组合注解,告诉Spring我是一个Controller,请求过来的时候,记得扫描我 ok,在给他添加@RequestMapping注解,为这个Controler指明路径 @RestController @RequestMapping("/Demo") public class DemoController { @Respo

Spring Boot全局支持CORS(跨源请求)

1 import org.springframework.context.annotation.Configuration; 2 import org.springframework.web.servlet.config.annotation.CorsRegistry; 3 import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 4 5 /** 6 * @Author:CoderZZ 7

Spring Boot 请求错误处理

方法一:Spring Boot将所有的错误映射到/error,实现ErrorController接口 1 @Controller 2 @RequestMapping("/error") 3 public class BaseErrorController implements ErrorController { 4 private final Logger logger = LoggerFactory.getLogger(BaseErrorController.class); 5 6

Spring Boot中使用AOP统一处理Web请求日志

AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是Spring框架中的一个重要内容,它通过对既有程序定义一个切入点,然后在其前后切入不同的执行内容,比如常见的有:打开数据库连接/关闭数据库连接.打开事务/关闭事务.记录日志等.基于AOP不会破坏原来程序逻辑,因此它可以很好的对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率.

Spring Boot如何让某个Controller支持跨源请求,以及如何让Controller类某个成员方法支持跨源请求

在前面我们已经讨论了Spring Boot 如何全局支持跨源请求.如果你想了解可以查看这篇文章 下面我们讨论另一种场景.有些时候,你需要让你的应用在大部分的时候,仅仅支持当前域名下的请求.而仅仅在极其特殊的几个场合下,才支持跨源请求.这个时候,你需要把跨源请求仅仅缩小在几个Controller上,或者Controller类的几个成员方法上.这个时候你需要用到如下的注解:@CrossOrigin(origins = "*", maxAge = 3600) .把这个注解放到 Control

Spring Boot实现一个监听用户请求的拦截器

项目中需要监听用户具体的请求操作,便通过一个拦截器来监听,并继续相应的日志记录 项目构建与Spring Boot,Spring Boot实现一个拦截器很容易. Spring Boot的核心启动类继承WebMvcConfigurerAdapter // 增加拦截器 @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new RequestLog()); } //这

Spring Boot快速入门(二):http请求

原文地址:https://lierabbit.cn/articles/4 一.准备 postman:一个接口测试工具 创建一个新工程 选择web 不会的请看Spring Boot快速入门(一):Hello Spring Boot 二.开始 新建java类RequestCtrl 1.添加一个all方法,使用@RequestMapping注解,可以处理所有的http请求 @RestController//这是一个控制器并只返回数据不寻找视图 public class RequestCtrl { @R

spring boot aop打印http请求回复日志包含请求体

一.引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>