Spring 注解面面通 之 @CrossOrigin 注解应用详解

2023-10-09 20:40

本文主要是介绍Spring 注解面面通 之 @CrossOrigin 注解应用详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  跨源资源共享(CORS),是由大多数浏览器实现的W3C规范,允许对跨域请求进行灵活授权,用来代替IFRAMEJSONP等非正规实现方式。

  @CrossOrigin是用来处理跨源资源共享(CORS)的注解。

  注解解析

  ① value

    指定允许请求源列表,例如:value="http://example.com"

    *表示允许来自任意请求源的请求。

    其值存储在响应标头Access-Control-Allow-Origin中。

    默认情况下,其值为*,允许来自任意请求源的请求。

    注意:CORS处理时,从ForwardedX-Forwarded-HostX-Forwarded-PortX-Forwarded-Proto取请求源值。

  ② origins

    valueorigins含义相同,可以任选valueorigins进行设置。

    valueorigins若同时存在,两者的值需一致,否则启动时会出现异常。

Caused by: org.springframework.core.annotation.AnnotationConfigurationException: In annotation [org.springframework.web.bind.annotation.CrossOrigin] declared on public java.lang.String com.arhorchin.securitit.webannotations.CrossOriginController.crossOriginOrigins(java.util.Map) throws java.lang.Exception and synthesized from [@org.springframework.web.bind.annotation.CrossOrigin(maxAge=-1, methods=[], exposedHeaders=[], origins=[http://localhost:9299], allowedHeaders=[], value=[http://localhost:92991], allowCredentials=)], attribute 'origins' and its alias 'value' are present with values of [{http://localhost:9299}] and [{http://localhost:92991}], but only one is permitted.

  ③ allowedHeaders

    指定允许实际请求标头列表,例如:allowedHeaders="Content-Type,Access-Token"

    *表示允许实际请求带有任意标头。

    其值存储在响应标头Access-Control-Allow-Headers中。

    若为Cache-ControlContent-LanguageExpiresLast-ModifiedPragma,则无需设置。

    默认情况下,其值为*,允许实际请求带有任意标头。

  ④ exposedHeaders

    指定允许客户端(如浏览器)访问的响应标头列表,例如:exposedHeaders="Content-Length"

    其值存储在实际CORS请求的响应头Access-Control-Expose-Headers中。

    默认情况下,只允许客户端访问:Cache-ControlContent-LanguageContent-TypeExpiresLast-ModifiedPragma

​  ⑤ methods

    指定允许请求的HTTP方法。

    默认情况下,允许请求的HTTP方法与@RequestMapping相同。

  ⑥ allowCredentials

    指定其值,表示客户端(如浏览器)是否应将凭证(如Cookies)和跨域请求一起发送到服务器。

    其值存储在预处理响应标头Access-Control-Allow-Credentials中。

    注意:此选项与配置域建立了高级别的信任,由于公开敏感的信息(如CookiesCSRF令牌),会增加Web应用程序受攻击的概率。

    默认情况下,此值不设置,因此不允许使用任何凭证。

  ⑦ maxAge

    指定预处理响应的最大缓存期限,单位为秒。

    其值存储在预处理响应标头Access-Control-Max-Age中。

    其值设置合理可以有效减少客户端与服务器预处理请求的交互次数。

    其值为负,表示未定义。

    默认情况下,其值为1800秒(30分钟)。

  ⑧ DEFAULT_ORIGINSDEFAULT_ALLOWED_HEADERSDEFAULT_ALLOW_CREDENTIALSDEFAULT_MAX_AGE

    这些属性用于设置默认值,在Spring 5.0+版本中已废弃,由CorsConfiguration.applyPermitDefaultValues()方法来完成其功能。

  注解示例

  1)Controller,用来演示@CrossOrigin的使用方法。

package com.arhorchin.securitit.webannotations;import java.util.Map;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;/*** @author Securitit.* @note 演示@CrossOrigin注解使用方法.*/
@Controller
@RequestMapping("/WebAnnotations")
public class CrossOriginController {/*** logger.*/private Logger logger = LoggerFactory.getLogger(CrossOriginController.class);/*** 未使用@CrossOrigin.*/@ResponseBody@RequestMapping(value = "/UnCrossOrigin.do",method = RequestMethod.GET)public String unCrossOrigin(@RequestHeader Map<String, String> requestHeaderMap) throws Exception {logger.info("@CrossOrigin use default value.");return "@CrossOrigin use default value.";}/*** 使用默认值的@CrossOrigin.*/@ResponseBody@RequestMapping(value = "/CrossOrigin.do",method = RequestMethod.GET)@CrossOriginpublic String crossOrigin(@RequestHeader Map<String, String> requestHeaderMap) throws Exception {logger.info("@CrossOrigin use default value.");return "@CrossOrigin use default value.";}/*** 指定origins属性的@CrossOrigin.*/@ResponseBody@RequestMapping(value = "/CrossOriginOrigins.do",method = RequestMethod.GET)@CrossOrigin(origins="http://localhost:9299")public String crossOriginOrigins(@RequestHeader Map<String, String> requestHeaderMap) throws Exception {logger.info("@CrossOrigin with origins.");return "@CrossOrigin with origins.";}/*** 指定origins、allowedHeaders、exposedHeaders、allowCredentials属性的@CrossOrigin.*/@ResponseBody@RequestMapping(value = "/CrossOriginOriginsAllowCredentials.do",method = RequestMethod.GET)@CrossOrigin(origins="http://localhost:9299", allowCredentials="true")public String crossOriginAllowedHeadersExposedHeadersAllowCredentials(@RequestHeader Map<String, String> requestHeaderMap) throws Exception {logger.info("@CrossOrigin with origins、allowedHeaders、exposedHeaders、allowCredentials.");return "@CrossOrigin with origins、allowedHeaders、exposedHeaders、allowCredentials.";}}

  2) 启动服务,使用端口9199

  3) 使用《Spring 注解面面通 之 Http测试工具》中的工具页面,启动服务,使用端口9299

  ① 访问http://localhost:9199/spring-annotations/WebAnnotations/UnCrossOrigin.do

在这里插入图片描述

  ② 访问http://localhost:9199/spring-annotations/WebAnnotations/CrossOrigin.do

在这里插入图片描述

  ③ 访问http://localhost:9199/spring-annotations/WebAnnotations/CrossOriginOrigins.do

在这里插入图片描述

  总结

  Spring简化了@CrossOrigin开过过程中的配置,使得跨域请求处理更加便捷。

  源码解析基于spring-framework-5.0.5.RELEASE版本源码。

  若文中存在错误和不足,欢迎指正!

这篇关于Spring 注解面面通 之 @CrossOrigin 注解应用详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/175425

相关文章

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash