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

相关文章

一文详解SpringBoot中控制器的动态注册与卸载

《一文详解SpringBoot中控制器的动态注册与卸载》在项目开发中,通过动态注册和卸载控制器功能,可以根据业务场景和项目需要实现功能的动态增加、删除,提高系统的灵活性和可扩展性,下面我们就来看看Sp... 目录项目结构1. 创建 Spring Boot 启动类2. 创建一个测试控制器3. 创建动态控制器注

C#读写文本文件的多种方式详解

《C#读写文本文件的多种方式详解》这篇文章主要为大家详细介绍了C#中各种常用的文件读写方式,包括文本文件,二进制文件、CSV文件、JSON文件等,有需要的小伙伴可以参考一下... 目录一、文本文件读写1. 使用 File 类的静态方法2. 使用 StreamReader 和 StreamWriter二、二进

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Spring Boot中WebSocket常用使用方法详解

《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP

SpringBoot+Docker+Graylog 如何让错误自动报警

《SpringBoot+Docker+Graylog如何让错误自动报警》SpringBoot默认使用SLF4J与Logback,支持多日志级别和配置方式,可输出到控制台、文件及远程服务器,集成ELK... 目录01 Spring Boot 默认日志框架解析02 Spring Boot 日志级别详解03 Sp

java中反射Reflection的4个作用详解

《java中反射Reflection的4个作用详解》反射Reflection是Java等编程语言中的一个重要特性,它允许程序在运行时进行自我检查和对内部成员(如字段、方法、类等)的操作,本文将详细介绍... 目录作用1、在运行时判断任意一个对象所属的类作用2、在运行时构造任意一个类的对象作用3、在运行时判断

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

Spring WebFlux 与 WebClient 使用指南及最佳实践

《SpringWebFlux与WebClient使用指南及最佳实践》WebClient是SpringWebFlux模块提供的非阻塞、响应式HTTP客户端,基于ProjectReactor实现,... 目录Spring WebFlux 与 WebClient 使用指南1. WebClient 概述2. 核心依