当前位置:

首页 > 编程开发 > Springboot如何解决ajax自定义headers的跨域请求问题

Springboot如何解决ajax自定义headers的跨域请求问题

1、什么是跨域由于浏览器同源策略(同源策略,它是由Netscape提出的一个著名的安全策略。现在所有支持JavaScript的浏览器都会使用这个策略。所谓同源是指,域名,协议,端口相同。),凡是发送请求url的协议、域名、端口三者之间任意一与当前页面地址不同即为跨域。具体可以查看下表:2、springboot如何解决跨域问题1.普通跨域请求解决方案:①请求接口添加注解@CrossOrigin(origins="http://127.0.0.1:8020",maxAge=3600)说明:origins="h

本文目录

    1、什么是跨域

    由于浏览器同源策略(同源策略,它是由Netscape提出的一个著名的安全策略。现在所有支持JavaScript 的浏览器都会使用这个策略。所谓同源是指,域名,协议,端口相同。),凡是发送请求url的协议、域名、端口三者之间任意一与当前页面地址不同即为跨域。

    具体可以查看下表:

    Springboot如何解决ajax自定义headers的跨域请求问题

    2、springboot如何解决跨域问题

    1.普通跨域请求解决方案:

    ①请求接口添加注解@CrossOrigin(origins = "http://127.0.0.1:8020", maxAge = 3600)

    说明:origins = "http://127.0.0.1:8020" origins值为当前请求该接口的域

    ②通用配置(所有接口都允许跨域请求)

    新增一个configration类 或 在Application中加入CorsFilter和CorsConfiguration方法

    @Configuration 
    public class CorsConfig { 
      private CorsConfiguration buildConfig() { 
        CorsConfiguration corsConfiguration = new CorsConfiguration(); 
        corsConfiguration.addAllowedOrigin("*"); // 1允许任何域名使用
        corsConfiguration.addAllowedHeader("*"); // 2允许任何头
        corsConfiguration.addAllowedMethod("*"); // 3允许任何方法(post、get等) 
        return corsConfiguration; 
      } 
    
      @Bean 
      public CorsFilter corsFilter() { 
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); 
        source.registerCorsConfiguration("/**", buildConfig()); // 4 
        return new CorsFilter(source); 
      } 
    }

    2.ajax自定义headers的跨域请求

    $.ajax({
        type:"GET",
        url:"http://localhost:8766/main/currency/sginInState",
        dataType:"JSON",
        data:{
          uid:userId
        },
        beforeSend: function (XMLHttpRequest) {
          XMLHttpRequest.setRequestHeader("Authorization", access_token);
        },
        success:function(res){
          console.log(res.code)
        }
      })

    此时请求http://localhost:8766/main/currency/sginInState接口发现OPTIONS http://localhost:8766/main/currency/sginInState 500错误,普通跨域的解决方案已经无法解决这种问题,为什么会出现OPTIONS请求呢?

    Springboot如何解决ajax自定义headers的跨域请求问题

    原因

    浏览器会在发送真正请求之前,先发送一个方法为OPTIONS的预检请求 Preflighted requests 这个请求是用来验证本次请求是否安全的,但是并不是所有请求都会发送,需要符合以下条件:

    •请求方法不是GET/HEAD/POST
    •POST请求的Content-Type并非application/x-www-form-urlencoded, multipart/form-data, 或text/plain

    •请求设置了自定义的header字段

    对于管理端的接口,我有对接口进行权限校验,每次请求需要在header中携带自定义的字段(token),所以浏览器会多发送一个OPTIONS请求去验证此次请求的安全性。

    为何OPTIONS请求是500呢?

    OPTIONS请求只会携带自定义的字段,并不会将相应的值带入进去,而后台校验token字段时 token为NULL,所以验证不通过,抛出了一个异常。

    那么我们现在来解决这种问题:

    ① spring boot项目application.yml中添加

    spring:
    mvc:
    dispatch-options-request: true

    注意:这种解决方案可能在某些情况下并不能解决OPTIONS问题,原因可能是环境问题,也可能是复杂的自定义filter过滤器配置问题等。

    ②添加过滤器配置

    第一步:手写RequestFilter请求过滤器配置类此类需要实现HandlerInterceptor类,HandlerInterceptor类是org.springframework.web.servlet.HandlerInterceptor下的。

    具体代码实现:

    @Component
    public class RequestFilter implements HandlerInterceptor {
      public boolean preHandler(HttpServletRequest request,HttpServletResponse response,Object handler){
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS");
        response.setHeader("Access-Control-Max-Age", "86400");
        response.setHeader("Access-Control-Allow-Headers", "Authorization");
        // 如果是OPTIONS请求则结束
        if (HttpMethod.OPTIONS.toString().equals(request.getMethod())) {
          response.setStatus(HttpStatus.NO_CONTENT.value());
          return false;
        }
        return true;
      }
    }

    第二步:手写MyWebConfiguration此类需要继承WebMvcConfigurationSupport。

    注意:WebMvcConfigurationSupport是2.x版本以上的,1.x版本为WebMvcConfigurerAdapter 。

    具体代码实现:

    @Component
    public class MyWebConfiguration extends WebMvcConfigurationSupport{
      @Resource
      private RequestFilter requestFilter;
      @Override
      public void addInterceptors(InterceptorRegistry registry) {
        // 跨域拦截器
        registry.addInterceptor(requestFilter).addPathPatterns("/**");
      }
    }
    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    IE浏览器怀旧版在线网址
    IE浏览器怀旧版在线网址

    IE浏览器怀旧版在线网址:一次精准的技术时光回溯 最近,不少老用户和怀旧爱好者在反复搜索一个问题:那个经典的Internet Explorer,如今还能在哪里原汁原味地体验到?答案指向一个特定的地址:https://ie.microsoft.com/legacy/。 这个网站远不止是一个简单的“皮肤

    Spring MVC+ajax进行信息验证的方法
    Spring MVC+ajax进行信息验证的方法

    采用AJAX与SpringMVC的异步验证,通过XMLHttpRequest对象实现局部数据交换,利用@ResponseBody返回JSON或字符串,结合@RequestBody解析请求体,完成表单无刷新校验,包括用户名重复检测与密码一致性验证。该方法提升交互效率,减少带宽占用,有效确保数据准确性,提升用户体验。

    PHP - AJAX 与 PHP
    PHP - AJAX 与 PHP

    AJAX使网页无需整体刷新即可与服务器交换数据并局部更新,实现无刷新体验。通过PHP实例,用户在输入框键入字符时,JavaScript创建XMLHttpRequest对象向PHP文件发送请求,服务器查找匹配姓名并返回结果,实现实时提示。跨域请求需采用JSONP或CORS解决方案。

    如何防止 AJAX 请求缓存导致动态内容无法实时更新
    如何防止 AJAX 请求缓存导致动态内容无法实时更新

    使用jQuery的.load()方法定时刷新页面时,浏览器或服务器缓存可能导致动态内容无法实时更新。通过为每次请求附加毫秒级时间戳参数,可强制URL变化绕过缓存。需注意时间戳参数必须置于片段选择器之前,且服务端响应头不应设置长时间缓存。

    如何在不使用表单输入字段的情况下通过 Ajax 将视图数据发送到控制器
    如何在不使用表单输入字段的情况下通过 Ajax 将视图数据发送到控制器

    本方法采用JavaScript动态读取DOM元素中的文本、图片路径等非表单内容,通过Ajax(如fetch或jQuery)构造键值对对象,以POST请求发送至后端控制器,经校验后存入数据库,实现无需表单控件的数据传递与存储,适用于动态网页数据异步提交。

    Ajax Live Edit 返回 500 内部服务器错误的完整排查与修复指南
    Ajax Live Edit 返回 500 内部服务器错误的完整排查与修复指南

    在Laravel开发中,Ajax实时编辑出现500错误,主要原因包括:PHP数组多维嵌套、CSRF令牌缺失、控制器未返回JSON。修复方法:需要将数组改为一维关联,从meta标签读取令牌,控制器统一使用response()->json()方法返回,并加强输入验证与异常捕获,以彻底解决。

    如何正确处理 AJAX 提交后的 PHP 响应页面跳转问题
    如何正确处理 AJAX 提交后的 PHP 响应页面跳转问题

    AJAX 本身用于异步请求且不刷新页面,若需在提交数据后跳转并显示 PHP 处理结果,不应混合使用 $.ajax 和 window.open,而应改用表单 POST 提交或在 AJAX 成功回调中动态渲染响应内容。 很多开发者都遇到过这个典型的“断层”问题:前端明明通过 AJAX 把数据成功提交给了

    Ajax验证用户名是否存在的实例代码
    Ajax验证用户名是否存在的实例代码

    Ajax验证用户名是否存在的实例代码详解 在日常的Web项目开发中,注册功能里的用户名查重,几乎是每个新手必做的练习。这不,为了让大家对Ajax实现实时验证的流程有个透彻的理解,今天咱们就来拆解一个非常典型的例子,看看从前端页面、Ja vaScript逻辑,到后台Servlet、Service层,乃

    springmvc 结合ajax批量新增的实现方法
    springmvc 结合ajax批量新增的实现方法

    需要注意的问题 在实现SpringMVC结合Ajax进行批量新增功能时,有几个常见的“坑”需要提前留意。这些细节如果处理不当,很容易导致功能无法正常运行。具体来说,主要集中在以下几个方面: MVC框架中,如何正确处理前端传递的日期格式字符串。 当使用@ResponseBody注解返回一个自定义对象时

    laravel ajax curd 搜索登录判断功能的实现
    laravel ajax curd 搜索登录判断功能的实现

    Lara vel CRUD实战:整合Ajax与登录态管理的用户管理系统 在Lara vel项目中构建一个功能完整的后台管理系统,CRUD操作是基础,而结合Ajax实现无刷新交互、并妥善管理用户登录状态,则是提升体验与安全性的关键一步。接下来,我们就通过一个用户管理模块的实战案例,逐一拆解这些功能的实

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。