当前位置: 首页 > news >正文

【笑小枫的SpringBoot系列】【十】SpringBoot处理请求跨域问题

上一篇【笑小枫的SpringBoot系列】【九】SpringBoot用户登录拦截器刚刚说过使用拦截器对用户登录状态进行拦截,本文就顺便说说使用拦截器处理跨域问题吧。

我们本系列应该不会遇到跨域问题,但日常工作中,一个新项目和前端小伙伴联调时还是要处理跨域问题的,本文就一起简单的看一下,以后遇到了跨域问题也可以快速解决。

什么是跨域

CORS全称Cross-Origin Resource Sharing,意为跨域资源共享。当一个资源去访问另一个不同域名或者同域名不同端口的资源时,就会发出跨域请求。如果此时另一个资源不允许其进行跨域资源访问,那么访问就会遇到跨域问题。

跨域指的是由于浏览器的安全性限制,不允许前端页面访问协议不同、域名不同、端口号不同的http接口,例如我本地创建一个html,里面写一个ajax请求访问我服务器SpringBoot应用提供的接口:192.168.1.11:8080/getUser
则会出报 No 'Access-Control-Allow-Origin' header is present on the requested resource. 错误。

SpringBoot怎么解决跨域

在springboot中可以采用多种方式解决跨域问题,例如:可以在类或方法上添加@CrossOrigin 注解。还有一种就是全局配置,全局配置需要添加自定义类实现 WebMvcConfigurer 接口,然后实现接口中的 addCorsMappings 方法。

  • addMapping:表示对哪种格式的请求路径进行跨域处理。
  • allowedHeaders:表示允许的请求头,默认允许所有的请求头信息。
  • allowedMethods:表示允许的请求方法,默认是 GET、POST 和 HEAD。这里配置为 * 表示支持所有的请求方法。
  • maxAge:表示探测请求的有效期
  • allowedOrigins 表示支持的域

详细代码如下👇👇

package com.maple.demo.filter;

import org.springframework.core.annotation.Order;
import org.springframework.http.HttpHeaders;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 跨域拦截.
 *
 * @author 笑小枫
 * @date 2022-07-21 19:23:08
 * @since JDK 1.8
 */
@WebFilter(filterName = "corsFilter", urlPatterns = "/*")
@Order(0)
public class CorsFilter implements Filter {

    private static final String HEADER_ORIGIN = "Origin";
    private static final String METHOD_OPTIONS = "OPTIONS";

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        final HttpServletRequest request = (HttpServletRequest) req;
        final HttpServletResponse response = (HttpServletResponse) res;
        if (request.getHeader(HEADER_ORIGIN) != null) {
            response.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, request.getHeader(HEADER_ORIGIN));
        }

        response.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
        // 如果允许所有请求方式,用*
        response.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "GET, POST, PUT, DELETE, OPTIONS");
        response.setHeader(HttpHeaders.ACCESS_CONTROL_MAX_AGE÷, "3600");
        // 如果允许所有header,用*
        response.setHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, "Authorization, Content-Type, Accept, X-Requested-With, remember-me");
        response.setHeader(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, "Content-Disposition");

        if (METHOD_OPTIONS.equalsIgnoreCase(request.getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
            return;
        }
        chain.doFilter(req, res);
    }
}

关于笑小枫💕

本章到这里结束了,喜欢的朋友关注一下我呦😘😘,大伙的支持,就是我坚持写下去的动力。
老规矩,懂了就点赞收藏;不懂就问,日常在线,我会就会回复哈~🤪
微信公众号:笑小枫
笑小枫个人博客:https://www.xiaoxiaofeng.com
本文源码:https://github.com/hack-feng/maple-demo

相关文章:

  • 算法竞赛入门【码蹄集进阶塔335题】(MT2326-2330)
  • Keychron Q1:客制化机械键盘|体验
  • Linux C/C++ 多线程开发 - 基础介绍
  • C语言内存讲解-详说内存分布和heap空间
  • SpringBoot电商项目前后端界面搭建
  • Android 天气APP(三十六)运行到本地AS、更新项目版本依赖、去掉ButterKnife
  • 【C++学习】string的使用
  • WeMos Mini ESP32-S2FN4R2介绍
  • Halcon图像分割总结
  • 5 h0255. 迷宫问题,6 h0253. 鸣人和佐助(广度优先搜索)
  • 《数据结构》堆栈(铁路、洗牌、汉诺塔、走迷宫)全解析
  • 基于时序行为的协同过滤推荐算法(Python)
  • Vue--》计算属性与监视(侦听)属性的使用
  • 【状语从句练习题】because / because of / although / in spite of
  • Web前端开发基础教程二
  • MySQL数据库运维之数据恢复
  • 构建二叉树进行数值数组的去重及优化
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • 带你开发类似Pokemon Go的AR游戏
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​520就是要宠粉,你的心头书我买单
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ![CDATA[ ]] 是什么东东
  • #Ubuntu(修改root信息)
  • (003)SlickEdit Unity的补全
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (20050108)又读《平凡的世界》
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (五)Python 垃圾回收机制
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (轉貼) UML中文FAQ (OO) (UML)
  • .Mobi域名介绍
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .Net程序帮助文档制作
  • .net分布式压力测试工具(Beetle.DT)
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • @ModelAttribute使用详解
  • [].slice.call()将类数组转化为真正的数组
  • [ARC066F]Contest with Drinks Hard
  • [C++] 如何使用Visual Studio 2022 + QT6创建桌面应用
  • [CISCN2019 华北赛区 Day1 Web5]CyberPunk --不会编程的崽
  • [Electron] 将应用打包成供Ubuntu、Debian平台下安装的deb包
  • [HTML]Web前端开发技术7(HTML5、CSS3、JavaScript )CSS的定位机制——喵喵画网页
  • [POJ - 2386]
  • [Spring MVC 4] MyBatis 分页开发
  • [导入]MsAjax Lib- Array.indexOf 函数
  • [动态规划] (十四) 简单多状态 LeetCode LCR 091.粉刷房子
  • [附源码]Python计算机毕业设计白果园网上水果超市
  • [剪藏] - 由哇哈哈和农夫山泉所想到的
  • [九度—剑指offer]—二维数组查找
  • [瞭望]关于Ruby on rails
  • [瞭望站] 客户同我们一起成长。。。