• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

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

武飞扬头像
笑小枫
帮助1

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

什么是跨域

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);
    }
}

关于笑小枫💕

本系列其它文章

本系列的源码已同步在Github:https://github.com/hack-feng/maple-demo

  1. SpringBoot项目创建

  2. SpringBoot配置基于swagger2的knife4j接口文档

  3. SpringBoot集成Mybatis Plus

  4. SpringBoot返回统一结果包装

  5. SpringBoot返回统一异常处理

  6. SpringBoot日志打印Logback详解

  7. SpringBoot控制台自定义banner

  8. SpringBoot集成Redis

  9. SpringBoot用户登录拦截器

  10. SpringBoot处理请求跨域问题

  11. SpringBoot接口日志信息统一记录

  12. SpringBoot导入Excel

  13. SpringBoot导出Excel

  14. SpringBoot发送邮件

  15. SpringBoot根据模板生成Word

  16. SpringBoot生成PDF

  17. SpringBoot文件上传下载

  18. SpringBoot中的Properties配置

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgakcke
系列文章
更多 icon
同类精品
更多 icon
继续加载