Spring 跨域问题CORS (Cross Origin Resources Share)

1、Spring给我们提供了三种跨域方法

  1. CorsFilter 过滤器
  2. CorsConfiguration Bean
  3. @CrossOrigin 注解

2、CorsFilter 过滤器

CorsFilter代码如下:

package com.xiaobai.filter;

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

@WebFilter(filterName = "MyFilter")
public class MyFilter implements Filter {

    public void destroy() {
    }
    String allowList [] = null;

    @Override
    public void init(FilterConfig config) throws ServletException {
        String origins = config.getInitParameter("allowList");
        if(origins != null){
            if(origins.equals("*")){
                allowList = new String[]{"*"};
            }else {
                allowList = origins.split(",");
            }
        }
    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws ServletException, IOException {
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        HttpServletRequest request = (HttpServletRequest) servletRequest;

        String origin = request.getHeader("Origin");
        if (origin != null && !origin.isEmpty()) {
            for (String s : allowList) {
                if (s.equals(origin) || s.equals("*")) {
                    response.setHeader("Access-Control-Allow-Origin", origin);
                }
            }
        }
        chain.doFilter(request, response);
    }
}

web.xml代码如下:

    <filter>
        <filter-name>MyFilter</filter-name>
        <filter-class>com.xiaobai.filter.MyFilter</filter-class>

        <init-param>
            <param-name>allowList</param-name>
            <param-value>http://127.0.0.1:8081, http://192.168.2.24:8081</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>MyFilter</filter-name>
        <url-pattern>/aa</url-pattern>
    </filter-mapping>

3、CorsConfiguration Bean

<mvc:cors>:

<mvc:cors>
  <mvc:mapping path="/xxx"
               allowed-origins="http://localhost:7070"
               allowed-methods="GET, POST"
               allowed-headers="Accept-Charset, Accept, Content-Type"
               allow-credentials="true" />
  <mvc:mapping path="/yyy/*"
               allowed-origins="*"
               allowed-methods="*"
               allowed-headers="*" />
</mvc:cors>

4、@CrossOrigin 注解

@CrossOrigin 注解本质上也是用来配置 CorsConfiguration。

@CrossOrigin代码如下:

@CrossOrigin
public class CORSController {
    public String cors(@RequestParam(defaultValue = "callback") String callback, HttpServletResponse response) {
        // 最原始的方式,手动写请求头
        response.setHeader("Access-Control-Allow-Origin", "http://192.168.163.1:8081");
        return callback + "(‘hello‘)";
    }

    // 将跨域设置在方法上
    @RequestMapping("/cors")
    @CrossOrigin(origins = {"http://localhost:8080", "http://remotehost:82323"},
                 methods = {RequestMethod.GET, RequestMethod.POST},
                 allowedHeaders = {"Content-Type", "skfjksdjfk"},
                 allowCredentials = "true",
                 maxAge = 1898978
                 )
    @RequestMapping("/rrr")
    public String rrr(@RequestParam(defaultValue = "callback") String callback) {
        return callback + "(‘rrr‘)";
    }
}

5、其实也可以采用全注解的方式

结合 @ControllerAdvice 使用,进行全局化:

@Component
@ControllerAdvice
@CrossOrigin
public class CorsAdvice {
}

  

原文地址:https://www.cnblogs.com/Qi1007/p/10030245.html

时间: 2024-11-05 01:06:49

Spring 跨域问题CORS (Cross Origin Resources Share)的相关文章

spring 设置跨域 CORS (Cross Origin Resources Share) 跨域

Spring提供了三种方式跨域 1.CorsFilter 过滤器 2.<mvc:cors> Bean 3.@CrossOrigin注解 以上三种方式本质都是用来配置CorsConfiguration 1.CorsFilter 过滤器 首先创建一个自己的过滤器 这里我创建一个类,名字为MyCorsFilter import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.Url

跨域访问CORS探究

什么是跨域? 跨域,简单地讲,就是一个Web应用(http://www.a.com)下的文档或脚本访问另一个Web应用(http://www.b.com)下的资源.任何两个应用所在域,只要存在协议.域名或端口任意一个不相同,即被认为访问是跨域的. 为什么会出现跨域访问限制? 由于浏览器同源策略,我们这里主要讨论XmlHttpRequest同源策略,XmlHttpRequest同源策略禁止XHR对象向不同源的服务器地址发送请求,这是浏览器出于安全考虑所做的限制. 使用ajax向另一个域下的应用发送

rest_framework 跨域和CORS

本节目录 一 跨域 二 CORS 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 跨域 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现. 同源策略,它是由Netscape提出的一个著名的安全策略.现在所有支持JavaScript 的浏览器都会使用这个策略.所谓同源是指,域名,协议,端口相同.当

百万年薪python之路 -- 请求跨域和CORS协议详解

楔子 什么是同源策略 同源策略,它是由Netscape提出的一个著名的安全策略.现在所有支持JavaScript 的浏览器都会使用这个策略.所谓同源是指,域名,协议,端口相同.当一个浏览器的两个tab页中分别来自127.0.0.1:8000和127.0.0.1:8001的页面,当浏览器的127.0.0.1:8000的tab页执行一个脚本的时候会检查这个脚本是属于哪个页面的,即检查是否同源,只有和127.0.0.1:8000同源的脚本才会被执行.如果非同源,那么在请求数据时,浏览器会在控制台中报一

跨域和CORS

目录 跨域和CORS 一 跨域 二 CORS 跨域和CORS 本节目录 一 跨域 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现. 同源策略,它是由Netscape提出的一个著名的安全策略.现在所有支持JavaScript 的浏览器都会使用这个策略.所谓同源是指,域名,协议,端口相同.当一个浏览器的两个tab页中分别打开

跨域解决方案CORS使用方法

CORS(Cross-Origin Resource Sharing), 目前CORS还处于w3c的草案,它定义了跨域访问时服务器和客户端之间如何通信.他的原理是通过定义HTTP头部的信息,来让客户端和服务器互相确认,从而决定是否相应本次请求. 兼容性: IE10+  chrome21+  firefox21+  safari5.1+  opera12.1+ (IE8, 9中使用XDomainRequest) 详见 http://caniuse.com/cors , 可通过(new XMLHtt

Ajax请求的跨域(CORS)问题

用浏览器,通过XHR(XMLHttpRequest)请求向另外一个域名请求数据时,会碰到跨域(CORS)问题. CORS:Cross-Origin Resource Sharing 什么是跨域? 简单的来说,出于安全方面的考虑,浏览器页面中的JavaScript无法访问其他服务器上的数据,即"同源策略".而跨域就是通过某些手段来绕过同源策略限制,实现不同服务器之间的通信. 解决方法: 基本的解决思路就是利用filter在response中加入一个头"Access-Contro

Java - Spring MVC 实现跨域资源 CORS 请求

拦截器设置响应头 这种方式原理就是利用拦截器在方法执行前,我们增加请求的响应头,用来支持跨域请求.这种方案是可行的,大部分都是采用这种方案.我当时也是打算采用这种方案,直到我发现原来 Spring 框架已经支持了 CORS 之后,就果断采用了 Spring 框架的内置的方案,其实原理也是一样的. 直接配置即可: <!-- API 接口跨域配置 --> <mvc:cors> <mvc:mapping path="/api/**" allowed-origin

跨域资源共享 CORS 详解

一.简介 CORS需要浏览器和服务器同时支持.目前,所有浏览器都支持该功能,IE浏览器不能低于IE10. 整个CORS通信过程,都是浏览器自动完成,不需要用户参与.对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码完全一样.浏览器一旦发现AJAX请求跨源,就会自动添加一些附加的头信息,有时还会多出一次附加的请求,但用户不会有感觉. 因此,实现CORS通信的关键是服务器.只要服务器实现了CORS接口,就可以跨源通信. 二.两种请求 浏览器将CORS请求分成两类:简单请求(simple