首页 > 其他分享 >SpringBoot 处理 CORS 跨域请求的三种方法

SpringBoot 处理 CORS 跨域请求的三种方法

时间:2024-11-13 09:42:59浏览次数:1  
标签:Control SpringBoot Access Allow CORS 请求 public 跨域

原文链接:SpringBoot 处理 CORS 跨域请求的三种方法 – 每天进步一点点

 

0.前言

pringboot跨域问题,是当前主流web开发人员都绕不开的难题。但我们首先要明确以下几点

  • 跨域只存在于浏览器端,不存在于安卓/ios/Node.js/python/ java等其它环境
  • 跨域请求能发出去,服务端能收到请求并正常返回结果,只是结果被浏览器拦截了。
  • 之所以会跨域,是因为受到了同源策略的限制,同源策略要求源相同才能正常进行通信,即协议、域名、端口号都完全一致。

浏览器出于安全的考虑,使用 XMLHttpRequest对象发起 HTTP请求时必须遵守同源策略,否则就是跨域的HTTP请求,默认情况下是被禁止的。换句话说,浏览器安全的基石是同源策略。

同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。

1.什么是CORS

CORS是一个W3C标准,全称是”跨域资源共享”(Cross-origin resource sharing),允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。

它通过服务器增加一个特殊的Header[Access-Control-Allow-Origin]来告诉客户端跨域的限制,如果浏览器支持CORS、并且判断Origin通过的话,就会允许XMLHttpRequest发起跨域请求。

CORS Header

  • Access-Control-Allow-Origin: http://www.xxx.com
  • Access-Control-Max-Age:86400
  • Access-Control-Allow-Methods:GET, POST, OPTIONS, PUT, DELETE
  • Access-Control-Allow-Headers: content-type
  • Access-Control-Allow-Credentials: true
CROS  Header 属性 解释
Access-Control-Allow-Origin 允许http://www.xxx.com发起跨越
Access-Control-Max-Age 设置在86400秒不需要再发送预校验请求
Access-Control-Allow-Methods 设置允许跨域请求的方法
Access-Control-Allow-Headers 允许跨域请求包含content-type
Access-Control-Allow-Credentials 设置允许Cookie
2.SpringBoot跨域请求处理方式

方法一:直接采用SpringBoot的注解@CrossOrigin(也支持SpringMVC)

简单粗暴的方式,Controller层在需要跨域的类或者方法上加上该注解即可

@RestController @CrossOrigin @RequestMapping("/situation") public class SituationController extends PublicUtilController {   @Autowired private SituationService situationService; // log日志信息 private static Logger LOGGER = Logger.getLogger(SituationController.class);       }

但每个Controller都得加,太麻烦了,怎么办呢,加在Controller公共父类(PublicUtilController)中,所有Controller继承即可。

@CrossOrigin public class PublicUtilController {   /** * 公共分页参数整理接口 * * @param currentPage * @param pageSize * @return */ public PageInfoUtil proccedPageInfo(String currentPage, String pageSize) {   /* 分页 */ PageInfoUtil pageInfoUtil = new PageInfoUtil(); try { /* * 将字符串转换成整数,有风险, 字符串为a,转换不成整数 */ pageInfoUtil.setCurrentPage(Integer.valueOf(currentPage)); pageInfoUtil.setPageSize(Integer.valueOf(pageSize)); } catch (NumberFormatException e) { } return pageInfoUtil; }   }

当然,这里虽然指SpringBoot,SpringMVC也是同样的,但要求在Spring4.2及以上的版本。另外,如果SpringMVC框架版本不方便修改,也可以通过修改tomcat的web.xml配置文件来处理

SpringMVC使用@CrossOrigin使用场景要求

  • jdk1.8+
  • Spring4.2+

方法二:处理跨域请求的Configuration

增加一个配置类,CrossOriginConfig.java。继承WebMvcConfigurerAdapter或者实现WebMvcConfigurer接口,其他都不用管,项目启动时,会自动读取配置。

@Configuration public class CorsConfig extends WebMvcConfigurerAdapter { static final String ORIGINS[] = new String[] { "GET", "POST", "PUT", "DELETE" }; @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**").allowedOrigins("*").allowCredentials(true).allowedMethods(ORIGINS).maxAge(3600); } }

方法三:采用过滤器(filter)的方式

同方法二加配置类,增加一个CORSFilter 类,并实现Filter接口即可,其他都不用管,接口调用时,会过滤跨域的拦截。

@Component public class CORSFilter implements Filter {   @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletResponse res = (HttpServletResponse) response; res.addHeader("Access-Control-Allow-Credentials", "true"); res.addHeader("Access-Control-Allow-Origin", "*"); res.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT"); res.addHeader("Access-Control-Allow-Headers", "Content-Type,X-CAF-Authorization-Token,sessionToken,X-TOKEN"); if (((HttpServletRequest) request).getMethod().equals("OPTIONS")) { response.getWriter().println("ok"); return; } chain.doFilter(request, response); } @Override public void destroy() { } @Override public void init(FilterConfig filterConfig) throws ServletException { } }

标签:Control,SpringBoot,Access,Allow,CORS,请求,public,跨域
From: https://www.cnblogs.com/longkui-site/p/18543170

相关文章

  • 【springboot应用】Spring Boot 3.3 + Neo4j:轻松实现图数据库操作的完全指南
    简介:Neo4j和SpringBoot集成Neo4j是一种开源的NoSQL图数据库,专为处理关联性强的大数据而设计。传统的关系型数据库(RDBMS)不擅长处理大量的关系数据,而Neo4j则通过基于图的模型使这些关系处理得更高效、直观。SpringBoot提供了很多与Neo4j集成的便捷工具,如spring-boot-......
  • 基于Java+SpringBoot+Mysql在线课程学习教育系统功能设计与实现五
    一、前言介绍:免费获取:猿来入此1.1项目摘要随着信息技术的飞速发展和互联网的普及,教育领域正经历着深刻的变革。传统的面对面教学模式逐渐受到挑战,而在线课程学习教育系统作为一种新兴的教育形式,正逐渐受到广泛关注和应用。在线课程学习教育系统的出现,不仅为学生提供了更加灵......
  • 基于Java+SpringBoot+Mysql在线课程学习教育系统功能设计与实现六
    一、前言介绍:免费获取:猿来入此1.1项目摘要随着信息技术的飞速发展和互联网的普及,教育领域正经历着深刻的变革。传统的面对面教学模式逐渐受到挑战,而在线课程学习教育系统作为一种新兴的教育形式,正逐渐受到广泛关注和应用。在线课程学习教育系统的出现,不仅为学生提供了更加灵......
  • 基于java+springboot的Vehicle management系统网站
    课题说明基于Java+SpringBoot的Vehiclemanagement系统网站是一款专门用于车辆管理的综合性网络平台。该网站可实现车辆基本信息管理,详细记录车辆型号、车架号、发动机号、购置日期、颜色等内容,方便随时查询和更新。车辆状态跟踪功能可标记车辆是处于闲置、使用中、......
  • 基于java+springboot的社区帮帮团系统网站
    前言基于java+springboot的社区帮帮团系统网站是一个促进社区互助的综合性平台。它为社区居民提供便捷的注册与登录入口。居民可发布求助信息,详细描述问题,如家电维修、管道疏通、家教需求等,并可设置悬赏金额。同时,有能力提供帮助的居民能浏览这些求助,根据自身技能和......
  • 基于java+springboot的免费体育馆场地预约系统
    前言基于Java+SpringBoot的免费体育馆场地预约系统为民众健身提供了便利。系统存储体育馆各个场地的详细信息,包括场地类型(如篮球场、羽毛球场、乒乓球场等)、场地规格、可容纳人数、配套设施(如灯光、计分牌等)。用户可以方便地查看这些信息,根据自身需求选择合适的场地......
  • 基于java+springboot的美妆类免税商品选购系统
    前言基于Java+SpringBoot的美妆类免税商品选购系统为美妆爱好者购买免税商品提供了便捷途径。系统中存有丰富的美妆免税商品信息,涵盖各类品牌的口红、眼影、粉底、腮红等。每种商品都详细记录了品牌、型号、色号、功效、规格、免税价格等内容。同时,展示商品的高清图......
  • 基于java+springboot的美食推荐系统
    前言基于Java+SpringBoot的美食推荐系统能为用户带来个性化的美食体验。系统收集了海量的美食信息,包括各种菜系、餐厅菜品、街头小吃等。每道美食都有详细介绍,如口味特点、食材构成、烹饪方式、价格范围等。同时,还整合了餐厅的相关信息,如地址、环境、营业时间、服务......
  • 基于SpringBoot自然保护区林业资源信息管理系统的设计与实现
    博主主页:一点素材博主简介:专注Java技术领域和毕业设计项目实战、Java微信小程序、安卓等技术开发,远程调试部署、代码讲解、文档指导、ppt制作等技术指导。主要内容:毕业设计,SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Python、Nodejs、小程序、安卓app、大数据等设计与开发感兴趣......
  • 基于SpringBoot就业招聘系统的设计与实现
    博主主页:一点素材博主简介:专注Java技术领域和毕业设计项目实战、Java微信小程序、安卓等技术开发,远程调试部署、代码讲解、文档指导、ppt制作等技术指导。主要内容:毕业设计,SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Python、Nodejs、小程序、安卓app、大数据等设计与开发感兴趣......