<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:wfw="http://wellformedweb.org/CommentAPI/">
<channel>
<title>LuckyDu - SpringBoot</title>
<link>https://blog.anlucky.cn/index.php/tag/SpringBoot/</link>
<atom:link href="https://blog.anlucky.cn/index.php/feed/tag/SpringBoot/" rel="self" type="application/rss+xml" />
<language>zh-CN</language>
<description></description>
<lastBuildDate>Sun, 28 Apr 2024 11:09:22 +0800</lastBuildDate>
<pubDate>Sun, 28 Apr 2024 11:09:22 +0800</pubDate>
<item>
<title>SpringBoot解决全局跨域问题</title>
<link>https://blog.anlucky.cn/index.php/programming/java/215</link>
<guid>https://blog.anlucky.cn/index.php/programming/java/215</guid>
<pubDate>Sun, 28 Apr 2024 11:09:22 +0800</pubDate>
<dc:creator>都依凡</dc:creator>
<description><![CDATA[SpringBoot解决全局跨域问题什么是跨域跨域：指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的，是浏览器对javascript施加的安全限制。例如：a页面想获取b页面资源，...]]></description>
<content:encoded xml:lang="zh-CN"><![CDATA[
<h1>SpringBoot解决全局跨域问题</h1><h2>什么是跨域</h2><p>跨域：指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的，是浏览器对javascript施加的安全限制。</p><p>例如：a页面想获取b页面资源，如果a、b页面的协议、域名、端口、子域名不同，所进行的访问行动都是跨域的，而浏览器为了安全问题一般都限制了跨域访问，也就是不允许跨域请求资源。注意：跨域限制访问，其实是浏览器的限制。理解这一点很重要！！！</p><p>同源策略：是指协议，域名，端口都要相同，其中有一个不同都会产生跨域；</p><h2>同源策略</h2><p>同源，就是咱们域名、端口号、ip、采用的协议都相同，那么我们就是同源的<br>反之就是不同源的！！！<br>出于浏览器的同源策略限制。同源策略（Sameoriginpolicy）是一种约定，它是浏览器最核心也最基本的安全功能，如果缺少了同源策略，则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的，浏览器只是针对同源策略的一种实现。<br>所以，用最简单的话来说，就是前端可以发请求给服务器，服务器也可以进行响应，只是因为浏览器会对请求头进行判断，所以要么前端设置请求头，要么后端设置请求头</p><h2>JAVA解决CORS跨域请求的方式</h2><ol><li>返回新的CorsFilter</li><li>重写 WebMvcConfigurer</li><li>使用注解 @CrossOrigin</li><li>手动设置响应头 (HttpServletResponse)</li><li>自定web filter 实现跨域</li></ol><blockquote><p>注意:</p><p>CorFilter / WebMvConfigurer / @CrossOrigin 需要 SpringMVC 4.2以上版本才支持，对应springBoot 1.3版本以上<br>上面前两种方式属于全局 CORS 配置，后两种属于局部 CORS配置。如果使用了局部跨域是会覆盖全局跨域的规则，所以可以通过 @CrossOrigin 注解来进行细粒度更高的跨域资源控制。<br>其实无论哪种方案，最终目的都是修改响应头，向响应头中添加浏览器所要求的数据，进而实现跨域</p></blockquote><h2>这里只介绍全局解决SpringBoot跨域问题，使用返回新的CorsFilter方式</h2><h3>1. 编写CorsConfig.java 类</h3><pre><code class="lang-Java">/**
 * 解决全局跨域问题
 */
@Configuration
public class CorsConfig {
    @Bean
    public CorsFilter corsFilter() {

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();

        // 配置跨域
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        // 允许哪个请求头
        corsConfiguration.addAllowedHeader(&quot;*&quot;);
        // 允许哪个方法进行跨域
        corsConfiguration.addAllowedMethod(&quot;*&quot;);
        // 允许哪个请求来源进行跨域
        // corsConfiguration.addAllowedOrigin(&quot;*&quot;);
        corsConfiguration.addAllowedOriginPattern(&quot;*&quot;);
        // 是否允许携带cookie进行跨域
        corsConfiguration.setAllowCredentials(true);

        source.registerCorsConfiguration(&quot;/**&quot;,corsConfiguration);

        return new CorsFilter(source);
    }
}</code></pre><h3>2. 全局拦截器配置</h3><pre><code class="lang-Java">/**
 * 拦截器
 */
@Configuration
public class WebConfigure implements WebMvcConfigurer {
    /**
     * 全局解决跨域问题
     * @param registry
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping(&quot;/**&quot;)
                .allowedOriginPatterns(&quot;*&quot;)
                .allowedMethods(&quot;GET&quot;, &quot;HEAD&quot;, &quot;POST&quot;, &quot;PUT&quot;, &quot;DELETE&quot;, &quot;OPTIONS&quot;)
                .allowCredentials(true)
                .maxAge(3600)
                .allowedHeaders(&quot;*&quot;);
    }
}
</code></pre><blockquote><p>如此，这样，即解决</p><p>所有解决跨域问题，不外乎就是解决浏览器拦截问题，要么前端设置请求头，要么后端设置请求头，无论谁设置请求头，浏览器只要放行即可</p></blockquote>
]]></content:encoded>
<slash:comments>0</slash:comments>
<comments>https://blog.anlucky.cn/index.php/programming/java/215#comments</comments>
<wfw:commentRss>https://blog.anlucky.cn/index.php/feed/tag/SpringBoot/</wfw:commentRss>
</item>
</channel>
</rss>