SpringBoot解决CORS跨域(@CrossOrigin)

SpringBoot解决CORS跨域(@CrossOrigin)一、关于跨域介绍在前后分离的架构下,跨域问题难免会遇见比如,站点http://domain-a.com的某HTML页面通过的src请求http://domain-b.com/image.jpg。网络上的许多页面都会加载来自不同域的CSS样式表,图像和脚本等资源。出于安全原因,浏览器限制从脚本内发起的跨源HTTP请求。例如,XMLHttpRequest和FetchAPI…

大家好,又见面了,我是你们的朋友全栈君。

一、关于跨域介绍

在前后分离的架构下,跨域问题难免会遇见比如,站点 http://domain-a.com 的某 HTML 页面通过 的 src 请求 http://domain-b.com/image.jpg。网络上的许多页面都会加载来自不同域的CSS样式表,图像和脚本等资源。

出于安全原因,浏览器限制从脚本内发起的跨源HTTP请求。 例如,XMLHttpRequest和Fetch API遵循同源策略。 这意味着使用这些API的Web应用程序只能从加载应用程序的同一个域请求HTTP资源,除非使用CORS头文件。

跨域的体现,在于它的域名不同或者端口不同,但要注意以下的形式为非跨域模式
http://www.example.com/index.html ==> http://www.example.com/login.html


二、Spring Boot跨域(@CrossOrigin)

当然这里虽然指SpringBoot但是SpringMVC也是一样的,要求在Spring4.2及以上的版本

1、@CrossOrigin使用场景要求
  • jdk1.8+
  • Spring4.2+
2、@CrossOrigin源码解析(翻译参考网络,文末列出参考地址)
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CrossOrigin {

    String[] DEFAULT_ORIGINS = { "*" };

    String[] DEFAULT_ALLOWED_HEADERS = { "*" };

    boolean DEFAULT_ALLOW_CREDENTIALS = true;

    long DEFAULT_MAX_AGE = 1800;


    /**
     * 同origins属性一样
     */
    @AliasFor("origins")
    String[] value() default {};

    /**
     * 所有支持域的集合,例如"http://domain1.com"。
     * <p>这些值都显示在请求头中的Access-Control-Allow-Origin
     * "*"代表所有域的请求都支持
     * <p>如果没有定义,所有请求的域都支持
     * @see #value
     */
    @AliasFor("value")
    String[] origins() default {};

    /**
     * 允许请求头重的header,默认都支持
     */
    String[] allowedHeaders() default {};

    /**
     * 响应头中允许访问的header,默认为空
     */
    String[] exposedHeaders() default {};

    /**
     * 请求支持的方法,例如"{RequestMethod.GET, RequestMethod.POST}"}。
     * 默认支持RequestMapping中设置的方法
     */
    RequestMethod[] methods() default {};

    /**
     * 是否允许cookie随请求发送,使用时必须指定具体的域
     */
    String allowCredentials() default "";

    /**
     * 预请求的结果的有效期,默认30分钟
     */
    long maxAge() default -1;

}
3、@CrossOrigin使用

Spring Boot下的请求处理控制器

package com.example.demo.controller;

import com.example.demo.domain.User;
import com.example.demo.service.IUserFind;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * @Title: UserController
 * @ProjectName demo
 * @Description: 请求处理控制器
 * @author 浅然
 * @date 2018/7/2022:18
**/
@RestController
//实现跨域注解
//origin="*"代表所有域名都可访问
//maxAge飞行前响应的缓存持续时间的最大年龄,简单来说就是Cookie的有效期 单位为秒
//若maxAge是负数,则代表为临时Cookie,不会被持久化,Cookie信息保存在浏览器内存中,浏览器关闭Cookie就消失
@CrossOrigin(origins = "*",maxAge = 3600)
public class UserController {
    @Resource
    private IUserFind userFind;

    @GetMapping("finduser")
    public User finduser(@RequestParam(value="id") Integer id){
        //此处省略相应代码
    }
}

后台返回的数据

这里写图片描述

前端跨域请求

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title>demo</title>
		<script type="text/javascript" src="js/jquery-3.3.1.min.js" ></script>
	</head>
	<body>
		<input type="button" value="测试" onclick="ajaxloding()" />
		<div id="usermessage"></div>
		<script>
			var getdata=0;
			function ajaxloding(){
				$.ajax({
					async:false,
					type:"get",
					url:"http://localhost:8080/api/finduser?id=1",
					contentType: "application/x-www-form-urlencoded",
					dataType: "json",
					data: {},
					success:function(result){
						getdata=result.name
					},
					error: function (errorMsg) {
			            //请求失败时执行该函数
			            alert("请求数据失败!");
			        }
				});
				$("#usermessage").text(getdata)
			}
		</script>
	</body>
</html>

这样就解决了跨域问题,获取了后台的数据

这里写图片描述


参考

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/138682.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 初学嵌入式开发用什么开发板_minipcie接口定义

    初学嵌入式开发用什么开发板_minipcie接口定义上海域格MINIPCIE开发板使用1、开发板概述开发(评估)板是为客户提供模块开发调试(评估)的平台。帮助客户对模块快速完成测试、开发、评估、验证产品特性以及功能演示等。客户可以在没有制作PCB的情况下,就能完成熟悉模块功能,并DEMO出相关程序,缩短开发周期。开发板上是标准MINIPCIE接口,请务必配合特定模块的硬件手册和AT手册使用。2、功能描述2.1平面图2.2实物图开发板基本接口调试概述:支持1路5V直流输入接口(使用5V电源供电,可将电

    2022年9月7日
    1
  • 三菱数据移位指令_三菱PLC移位指令「建议收藏」

    三菱数据移位指令_三菱PLC移位指令「建议收藏」(2011-05-2014:09:54)转载▼标签:杂谈分类:技术三菱PLC移位指令分左移和右移,分别是SFTL和SFTR。而针对位的移位则是SFTLP和SFTRP,前几天给学生讲这个指令时专门做了个跑马灯的例子,用的就是这个指令。下面简单讲解一下SFTLP。指令格式为SFTLPM20M0K8K1SFTLP——对位进行左移;M20——移进来的是“1”还是“0”得看M20的状态,M…

    2022年4月29日
    251
  • 单片机中P1=0x01什么意思「建议收藏」

    单片机中P1=0x01什么意思「建议收藏」0x01是16进制,转化为二进制:00000001(字节(Byte)是计算机信息技术用于计量存储容量的一种计量单位,作为一个单位来处理的一个二进制数字串,是构成信息的一个小单位。最常用的字节是八位的字节,即它包含八位的二进制数)P1=0x01,表示P1.7~P.1=0,P1.0=1…

    2022年10月23日
    0
  • python爬虫爬图片教程_爬虫爬取图片的代码

    python爬虫爬图片教程_爬虫爬取图片的代码用Python爬虫来爬小姐姐本教程将教你从0开始走进Python爬虫1.我们先要知道Python爬虫的原理基本的Python爬虫原理很简单,分为三步获取网页源码通过分析源码并通过代码来获取其中想要的内容进行下载或其他操作话不多说直接开干注意!本教程只是为了快速入门爬虫并实现一个功能,不考虑代码写的漂不漂亮,规不规范先准备上我们的目标网页开始我用的工具是:JetBrai…

    2025年6月28日
    0
  • 线程池ThreadPool中QueueUserWorkItem的使用

    线程池ThreadPool中QueueUserWorkItem的使用先看代码://设置可以同时处于活动状态的线程池的请求数目。boolpool=ThreadPool.SetMaxThreads(8,8);if(pool){ThreadPool.QueueUserWorkItem(o=>this.DoSomethingLong(“参数1”));ThreadPool

    2022年9月24日
    1
  • let/const 的变量提升与暂时性死区

    let/const 的变量提升与暂时性死区在面试或一些文章中提到var和let/const区别时,总说var有变量提升,let/const不存在变量提升,这种说法是错误的.var和let/const都有变量提升,但是let/const暂时性死区的存在要求调用该类变量前必须先经过显式赋值

    2022年6月23日
    47

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号