SpringBoot教程(七) | SpringBoot解决跨域问题

这篇具有很好参考价值的文章主要介绍了SpringBoot教程(七) | SpringBoot解决跨域问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

SpringBoot教程(七) | SpringBoot解决跨域问题

上篇文章我们介绍了SpringBoot的拦截器的写法,其中有一个比较重要的步骤,就是把我们写好的拦截器注册到Spring的一个配置类中,这个类是实现了WebMvcConfigurer 接口,这个类很重要,因为这个类中除了可以注册拦截以外,还可以配置很多内容。今天我们来讲解一下SpringBoot如何解决跨域问题。 先来解释一下什么是跨域问题。

7.1 什么是跨域?

当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域

SpringBoot教程(七) | SpringBoot解决跨域问题,spring boot,后端,java

7.2 为什么会出现跨域

出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)

但是以前的程序为什么没有过跨域问题的困扰呢。那是因为以前的程序都不是前后端分离的。比如之前的jsp, freemarker实现的前端,他们和后端的代码都是放到一起的,所以他们一起部署,具有相同的域名,协议和端口号,自然不存在跨域的问题。

但是现在的程序都是前后端分离的程序,前后端分离的程序有什么特点,就是前后端都是单独部署的,前端服务和后端服务都会监听属于自己的端口号,所有很容易产生跨域的问题。当前端端不同源的时候,而前端的服务又需要去访问和他不同源的后端的接口,自然就产生了跨域的问题,所以在前后端分离的项目中,跨域问题是我们永远都绕不开的。

7.3 如何解决?

既然已经阐述了跨域问题,那我们应该如何解决呢?其实解决的方案还是不少的,我们列举几种常见的方法。

1. JSONP:

JSONP 是服务器与客户端跨源通信的常用方法。最大特点就是简单适用,兼容性好(兼容低版本IE),缺点是只支持get请求,不支持post请求。

核心思想:网页通过添加一个

这种方式是前端的实现,其实和后端关系不大。并且用的也不多。

2. Nginx 反向代理

使用 nginx 反向代理实现跨域,是最简单的跨域方式。只需要修改 nginx 的配置即可解决跨域问题,支持所有浏览器,支持 session,不需要修改任何代码,并且不会影响服务器性能。

我们只需要配置nginx,在一个服务器上配置多个前缀来转发http/https请求到多个真实的服务器即可。这样,这个服务器上所有url都是相同的域 名、协议和端口。因此,对于浏览器来说,这些url都是同源的,没有跨域限制。而实际上,这些url实际上由物理服务器提供服务。这些服务器内的 javascript可以跨域调用所有这些服务器上的url。

3. webpack本地代理

这个也是前端的一种实现,通过webpack技术,就可以将服务端进行反向代理,相当于前端模拟了nginx的功能,将后端的接口反代成一个同源的地址

4. CORS

CORS 是跨域资源分享(Cross-Origin Resource Sharing)的缩写。它是 W3C 标准,属于跨源 AJAX 请求的根本解决方法。

1、普通跨域请求:只需服务器端设置Access-Control-Allow-Origin

2、带cookie跨域请求:前后端都需要进行设置

服务器端对于CORS的支持,主要是通过设置Access-Control-Allow-Origin来进行的。如果浏览器检测到相应的设置,就可以允许Ajax进行跨域的访问。

我们重点讲解下springBoot如何通过设置CORS 来解决跨域问题。

7.4 解决方案

解决方案很简单,其实就是利用了我们昨天拦截器用到的那个配置类,在里面加一些代码即可。

java复制代码@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    // 昨天的拦截器注册
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //拦截
        registry.addInterceptor(new TokenInterceptor())
                // 对所有请求进行拦截
                .addPathPatterns("/**")
                // 排除 login请求
                .excludePathPatterns("/login");
    }

    //解决跨域问题
    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", buildConfig());
        return new CorsFilter(source);
    }

    private CorsConfiguration buildConfig() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("*");
        corsConfiguration.setAllowCredentials(true);
        corsConfiguration.addAllowedHeader("*");
        corsConfiguration.addAllowedMethod("*");

        return corsConfiguration;
    }
}

只需要按照上面的代码配置一下就行了,相当与设置允许所有。

除了这种方法,也可以通过Filter来实现。这个也给一下实现吧,和上面的方法任选其一。

java复制代码import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
 
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
 
 
/**
 * 自定义拦截器
 *
 * @author lvhuimin
 * @version 2019/12/21
 */
@Order(1)
@Component
@WebFilter(urlPatterns = "/*", filterName = "cooCorsFilter")
public class CooCorsFilter implements Filter {
 
    String ORIGIN = "Origin";
 
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
 
    }
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        String origin = httpRequest.getHeader(ORIGIN);
 
        httpResponse.setCharacterEncoding("UTF-8");
        httpResponse.setContentType("application/json; charset=utf-8");
        httpResponse.setHeader("Access-Control-Allow-Origin", origin);
        httpResponse.setHeader("Access-Control-Allow-Credentials", "true");
        httpResponse.setHeader("Access-Control-Allow-Methods", "*");
        // 如果允许所有header,就用*
        httpResponse.setHeader("Access-Control-Allow-Headers", "Content-Type,Authorization,token,userId,sysCode,requestSourceType");
        httpResponse.setHeader("Access-Control-Expose-Headers", "*");
        filterChain.doFilter(httpRequest, httpResponse);
    }
 
    @Override
    public void destroy() {
 
    }
 
}

这个就是写了一个Filter然后在过滤器中,来加上相应的设置。

好了跨域的问题我们就讲解到这里。但其实还是稍微有点问题,问题就是当我们的SpringBoot项目集成了Swagger的时候,上面的过滤器会和swagger的配置产生冲突,这个等到我们讲到swagger的时候再说。

另: 配套项目代码已托管中gitCode: gitcode.net/lsqingfeng/…文章来源地址https://www.toymoban.com/news/detail-799102.html

到了这里,关于SpringBoot教程(七) | SpringBoot解决跨域问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java跨域问题的几种后端解决方式

    跨域指的是:浏览器不能执行其他网站的脚本,从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域。跨域是由浏览器的同源策略造成的,是浏览器施加的安全限制。a页面想获取b页面资源,如果a、b页面的协议、域名、端口、子域名不同,所

    2024年02月08日
    浏览(33)
  • 解决Spring Boot前后端分离开发模式中的跨域问题

    在实际开发中,经常会遇到前端Vue应用与后端Spring Boot API接口存在跨域访问的问题。本篇博客将分享解决Spring Boot前端Vue跨域问题的实战经验,帮助开发者快速解决该问题。 跨域问题是由于浏览器的同源策略引起的。同源策略限制了从一个源加载的文档或脚本如何与来自另一

    2024年02月10日
    浏览(32)
  • SpringBoot教程(七) | SpringBoot解决跨域问题

    上篇文章我们介绍了SpringBoot的拦截器的写法,其中有一个比较重要的步骤,就是把我们写好的拦截器注册到Spring的一个配置类中,这个类是实现了WebMvcConfigurer 接口,这个类很重要,因为这个类中除了可以注册拦截以外,还可以配置很多内容。今天我们来讲解一下SpringBoot如何

    2024年01月17日
    浏览(24)
  • Spring Security系列教程之解决Spring Security环境中的跨域问题

    一. 启用Spring Security 的CORS支持 1. 普通的跨域 方式1:在接口方法上利用@CrossOrigin注解解决跨域问题 方式2:通过实现WebMvcConfigurer接口来解决跨域问题 二. Spring Security环境下的跨域问题解决 通过上面的配置,我们已经解决了Ajax的跨域请求问题,但是这个案例中也有潜在的威胁

    2024年02月05日
    浏览(32)
  • java篇-Springboot解决跨域问题的三种方式

    第一种:添加 @CrossOrigin 注解 在Controller层对应的方法上添加@CrossOrigin或者类上添加@CrossOrigin   第二种:添加CORS过滤器 新建配置类CorsConfig,创建 CorsFilter 过滤器,允许跨域  第三种:实现 WebMvcConfigurer ,重写 addCorsMappings 方法 全局配置有可能出现跨域失败的情况,改为过滤

    2024年04月23日
    浏览(31)
  • Spring Boot跨域问题简介

    在Web开发中,跨域指的是在浏览器中访问一个不同于当前域名的资源。浏览器出于安全考虑,限制了这种跨域资源的访问。具体来说,当浏览器使用XMLHttpRequest或Fetch API发送跨域请求时,目标服务器必须在响应头中包含特定的CORS(跨源资源共享)规则,否则浏览器会阻止该请

    2024年02月09日
    浏览(30)
  • web后端解决跨域问题

    目录 什么是跨域问题 为什么限制访问 解决 域是指从一个域名的网页去请求另一个域名的资源。比如从www.baidu.com 页面去请求 www.google.com 的资源。但是一般情况下不能这么做,它是由浏览器的同源策略造成的,是浏览器对js施加的安全限制。跨域的严格一点的定义是:只要

    2024年02月13日
    浏览(31)
  • 快速解决Spring Boot跨域困扰:使用CORS实现无缝跨域支持

    什么是跨域? 跨域(Cross-Origin Issue)的存在是因为浏览器的安全限制,它防止恶意网站利用跨域请求来获取用户的敏感信息或执行恶意操作。浏览器通过实施同源策略来限制网页在不同源之间进行资源访问或交互的情况。当一个网页的协议、域名、或端口与当前页面的协议、

    2024年02月12日
    浏览(38)
  • 前端和后端解决跨域问题的方法

    目前很多java web开发都是采用前后端分离框架进行开发,相比于单体项目容易产生跨域问题。  后端接收到请求并返回结果了,浏览器把这个响应拦截了。 浏览器 基于同源策略,如果请求的网页和当前的服务 不是同源的 ,并且发送的是 XHR (XMLHttpRequest)请求,就会产生跨域

    2024年04月26日
    浏览(29)
  • java spring boot 注解、接口和问题解决方法(持续更新)

    @RestController         是SpringMVC框架中的一个注解,它结合了@Controller和@ResponseBody两个注解的功能,用于标记一个类或者方法,表示该类或方法用于处理HTTP请求,并将响应的结果直接返回给客户端,而不需要进行视图渲染 @Controller         是Spring Framework中的注解,用于

    2024年02月06日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包