专栏首页深入理解JavaSpring Boot使用CORS解决跨域问题

Spring Boot使用CORS解决跨域问题

一、跨域问题描述

Web开发经常会遇到跨域问题,解决方案有:jsonp,iframe,CORS等等。 CORS 与 JSONP 相比: 1、 JSONP 只能实现 GET 请求,而 CORS 支持所有类型的 HTTP 请求。 2、 使用 CORS,开发者可以使用普通的 XMLHttpRequest 发起请求和获得数据,比起 JSONP 有更好的 错误处理。 3、 JSONP 主要被老的浏览器支持,它们往往不支持 CORS,而绝大多数现代浏览器都已经支持了 CORS。

二、CORS常用的三种解决跨域问题的方法

这里我仅仅写出一个需要被跨域访问的方法,提出了三种解决方案。 需要被跨域访问的方法:

package com.lemon.springboot.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

/**
 * @author lemon
 */
@RestController
@RequestMapping("/api")
public class ApiController {

    private static final Logger logger = LoggerFactory.getLogger(ApiController.class);

    // @CrossOrigin({"http://localhost:8081", "http://localhost:8082"})
    @RequestMapping("/get")
    public Map<String, Object> get(@RequestParam String name) {
        Map<String, Object> map = new HashMap<>();
        map.put("title", "hello world");
        map.put("name", name);
        return map;
    }
}

1、配置全局跨域访问解决方案

写一个配置类,指定可以被跨域访问的路径以及可以跨域的主机链接。这样,8081和8082端口的应用就可以访问/api后所有的方法或者资源。

package com.lemon.springboot.configuration;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

/**
 * 全局配置跨域问题
 * @author lemon
 */
@Configuration
public class CustomCorsConfiguration {

    @Bean
    public WebMvcConfigurer corsConfigurer() {

        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                // 设置了可以被跨域访问的路径和可以被哪些主机跨域访问
                registry.addMapping("/api/**").allowedOrigins("http://localhost:8081", "http://localhost:8082");
            }
        };
    }
}

2、第二种全局设置方法

package com.lemon.springboot.configuration;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

/**
 * @author lemon
 */
@Configuration
public class CustomCorsConfiguration2 extends WebMvcConfigurerAdapter {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        // 设置了可以被跨域访问的路径和可以被哪些主机跨域访问
        registry.addMapping("/api/**").allowedOrigins("http://localhost:8081", "http://localhost:8082");
    }
}

3、使用@CrossOrigin注解实现细粒度控制(推荐使用)

直接在需要被跨域访问的方法上加上@CrossOrigin注解就可以实现被跨域访问。

package com.lemon.springboot.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

/**
 * @author lemon
 */
@RestController
@RequestMapping("/api")
public class ApiController {

    private static final Logger logger = LoggerFactory.getLogger(ApiController.class);

    @CrossOrigin({"http://localhost:8081", "http://localhost:8082"})
    @RequestMapping("/get")
    public Map<String, Object> get(@RequestParam String name) {
        Map<String, Object> map = new HashMap<>();
        map.put("title", "hello world");
        map.put("name", name);
        return map;
    }
}

这三种配置方法,当其他系统内的资源跨域访问的时候,就会起作用!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring Boot+JPA+Mysql完成数据库整合操作

    Spring Boot结合JPA操作Mysql数据库十分方便,可以做到零配置文件。具体流程如下。

    itlemon
  • Spring Cloud微服务技术栈(五):客户端负载均衡Spring Cloud Ribbon部分源码分析

    为了使客户端具备负载均衡的能力,我们在代码中将RestTemplate交给Spring管理的时候,会加上@LoadBalanced注解,如下代码所示:

    itlemon
  • Spring Boot整合Ehcache实现缓存功能

    这里介绍Spring Boot结合JPA,MySQL和Ehcache实现缓存功能,提高程序访问效率。

    itlemon
  • Springboot中使用redis进行api防刷限流

    首先我们编写注解类AccessLimit,使用注解方式在方法上限流更优雅更方便!三个参数分别代表有效时间、最大访问次数、是否需要登录,可以理解为 seconds...

    海向
  • (16)SpringBoot整合RabbitMQ

    https://blog.csdn.net/weixin_39800144/article/details/89037698

    IT云清
  • Spring Boot---(24)springboot整合RabbitMQ

    访问接口:http://localhost:8088/mq1/getUser1 然后访问控制台(上一篇:centOs安装rabbitMQ 有配置控制台的步骤...

    IT云清
  • SrpingCloud ---github上面如何使用webHook实现配置文件修改 ,客户端自动刷新

    增加了spring-boot-starter-actuator包,spring-boot-starter-actuator是一套监控的功能,可以监控程序在运行时...

    爱明依
  • springboot设置静态资源不拦截的方法

    Dream城堡
  • Spring security OAuth2.0认证授权学习第四天(SpringBoot集成)

     这个篇章主要是讲SpringSecurity的,SpringBoot不做主要讲解

    彼岸舞
  • spring cloud auth2简单的实战,后续会推出基于spring cloud auth2的SSO实战服务

    其实auth2服务还是蛮重要的,作为一个比较大的企业,可能会开发出各种自己公司的产品,这时候就需要单点登录支持,包括业务中台、技术中台的沉淀,这对一个公司来说是...

    gfu

扫码关注云+社区

领取腾讯云代金券