SpringBoot_Ajax_处理options请求

function https(url,type,data,header,callback) {
    $.ajax({
        url:url,
        type:type,
        data:data,
        contentType:'application/json',
        headers:header,
        crossDomain:true,
        success:function (data,status) {
            console.log(data);
            if(data.errorNo == "20001" || data.errorNo == "20002"){
            //令牌失效
                window.location.href = "./lyear_pages_login.html";
            }else if(data.errorNo == "0"){
                callback(data,status);
            }else{
                alert(data.errorInfo);
            }
        },
        error:function (XMLHttpRequest,textStatus,errorThrown) {
            if(textStatus==='timeout'){
                alert('請求超時');
                setTimeout(function(){
                    alert('重新请求');
                },2000);
            }
            window.location.href = "./lyear_pages_login.html";
        }
    })
}

使用改模板发送一个请求到本地服务器的时候,会出现以下的错误:403

General:
Request URL: http://localhost:9090/....
Request Method: OPTIONS
Status Code: 403 
Remote Address: [::1]:9090
Referrer Policy: no-referrer-when-downgrade

Response Headers:
Connection: keep-alive
Date: Sat, 28 Mar 2020 07:12:49 GMT
Keep-Alive: timeout=60
Transfer-Encoding: chunked
Vary: Origin, Access-Control-Request-Method, Access-Control-Request-Headers

Request Headers:
Provisional headers are shown
Access-Control-Request-Headers: authentication,content-type
Access-Control-Request-Method: GET
Origin: http://localhost:63342
Referer: http://localhost:63342/lyear_2_LightYear-admin/index.html
Sec-Fetch-Mode: cors
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36

可以看到这个请求是OPTIONS的,而不是我们预期的GET或是POST。

原因在于:https://www.cnblogs.com/wanghuijie/p/preflighted_request.html

也就是这是一个Preflighted Request,所以发送真正的请求之前会发送一个OPTIONS请求用于试探服务器是否能接受真正的请求。如果options获得的回应是拒绝性质的,比如404\403\500等http状态,就会停止post、get等请求的发出。

关于Preflighted Request(带预检的跨域请求)发生在:

(文档地址:https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#The_HTTP_request_headers)

  1. 请求方法不是GET/HEAD/POST
  2. POST请求的Content-Type并非application/x-www-form-urlencodedmultipart/form-data, 或text/plain
  3. 请求设置了自定义的header字段

以上封装的请求符合了2和3。而且在使用token验证和大量json数据的请求中是不可避免的。

解决方法:给OPTIONS请求一个正确的响应。

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(authenticationInterceptor())
                .addPathPatterns("/**");
    }

    /**
    *@Author: Czc on 2020/3/28 14:18
    *@param:
    *@return:
    *@Description: 跨域请求配置
    **/
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")
                .maxAge(3600)
                .allowCredentials(true);
    }
    @Bean
    public AuthenticationInterceptor authenticationInterceptor() {
        return new AuthenticationInterceptor();
    }
}

addCorsMappings方法对OPTIONS方法返回了允许的响应。

options请求

然后再发出真正的请求。

real request 当然,就像登陆校验拦截器一样,也可以通过拦截器对请求进行处理,再响应的报文头部中加上跨域请求相关的字段。然后对于OPTIONS请求直接截断返回。其他的请求继续进行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot可以使用@Controller注解和@ResponseBody注解处理Ajax请求。 @Controller注解用于标识一个类是一个控制器,可以处理请求和返回视图。 @ResponseBody注解用于将返回的数据直接写入HTTP响应中,而不是返回一个视图。 例如,以下代码展示了如何使用Spring Boot处理Ajax请求: ```java @Controller public class MyController { @RequestMapping(value = "/ajax", method = RequestMethod.POST) @ResponseBody public String handleAjaxRequest(@RequestBody String jsonString) { // 处理请求并返回响应数据 return "Hello, Ajax!"; } } ``` 在这个例子中,我们使用@RequestMapping注解将处理Ajax请求的方法映射到“/ajax”路径,并使用@RequestBody注解指定请求数据的类型。然后,我们使用@ResponseBody注解将返回的数据直接写入HTTP响应中,而不是返回一个视图。 在客户端,我们可以使用jQuery或其他JavaScript库发送Ajax请求处理响应。例如: ```javascript $.ajax({ type: "POST", url: "/ajax", data: JSON.stringify({name: "John", age: 30}), contentType: "application/json", dataType: "text", success: function(response) { console.log(response); }, error: function(xhr, status, error) { console.error(error); } }); ``` 在这个例子中,我们使用jQuery的$.ajax()方法发送一个POST请求到“/ajax”路径,并将一个JSON对象作为请求数据。我们还指定了contentType为“application/json”,dataType为“text”,以便正确处理请求和响应数据。最后,我们在success回调函数中处理响应数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值