Spring中的@CrossOrigin注解的使用详细解读

 更新时间:2023年11月17日 10:38:09   作者:securitit  
这篇文章主要介绍了Spring中的@CrossOrigin注解的使用详细解读,跨源资源共享(CORS),是由大多数浏览器实现的W3C规范,允许对跨域请求进行灵活授权,用来代替IFRAME或JSONP等非正规实现方式,需要的朋友可以参考下

@CrossOrigin注解的使用

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

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

注解解析

① value:

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

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

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

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

注意:CORS处理时,从Forwarded、X-Forwarded-Host、X-Forwarded-Port、X-Forwarded-Proto取请求源值。

② origins:

value与origins含义相同,可以任选value和origins进行设置。

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

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-Control、Content-Language、Expires、Last-Modified、Pragma,则无需设置。

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

④ exposedHeaders:

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

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

默认情况下,只允许客户端访问:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。

​⑤ methods:

指定允许请求的HTTP方法。

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

⑥ allowCredentials:

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

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

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

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

⑦ maxAge:

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

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

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

其值为负,表示未定义。

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

⑧ DEFAULT_ORIGINS、DEFAULT_ALLOWED_HEADERS、DEFAULT_ALLOW_CREDENTIALS、DEFAULT_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)
    @CrossOrigin
    public 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) 使用工具页面,启动服务,使用端口9299。

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

总结

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

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

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

到此这篇关于Spring中的@CrossOrigin注解的使用详细解读的文章就介绍到这了,更多相关@CrossOrigin注解的使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 在Java中int和byte[]的相互转换

    在Java中int和byte[]的相互转换

    这篇文章主要介绍了在Java中int和byte[]的相互转换的相关资料,需要的朋友可以参考下
    2016-11-11
  • java设计模式学习之代理模式

    java设计模式学习之代理模式

    这篇文章主要为大家详细介绍了java设计模式学习之代理模式的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • Java集合之LinkedHashSet类详解

    Java集合之LinkedHashSet类详解

    这篇文章主要介绍了Java集合之LinkedHashSet类详解,LinkedHashSet 是 Java 中的一个集合类,它是 HashSet 的子类,并实现了 Set 接口,与 HashSet 不同的是,LinkedHashSet 保留了元素插入的顺序,并且具有 HashSet 的快速查找特性,需要的朋友可以参考下
    2023-09-09
  • Java常见异常及处理方式总结

    Java常见异常及处理方式总结

    今天给大家带来的是Java的相关知识,文章围绕着Java异常展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • Spring Boot 使用Druid详解

    Spring Boot 使用Druid详解

    本篇文章主要介绍了Spring Boot 使用Druid配置详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Java8-Stream流操作List去重问题

    Java8-Stream流操作List去重问题

    这篇文章主要介绍了Java8-Stream流操作List去重问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • spring boot如何通过自定义注解和AOP拦截指定的请求

    spring boot如何通过自定义注解和AOP拦截指定的请求

    这篇文章主要介绍了spring boot通过自定义注解和AOP拦截指定的请求,本文主要通过切面类和自定注解的方式,拦截指定的接口(代码中已经作了详细的说明),需要的朋友可以参考下
    2024-06-06
  • 解决idea找不到或无法加载主类的错误处理

    解决idea找不到或无法加载主类的错误处理

    这篇文章主要介绍了解决idea找不到或无法加载主类的错误处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • IDEA插件之mybatisx插件使用教程(超详细!)

    IDEA插件之mybatisx插件使用教程(超详细!)

    MybatisX 是一款基于IDEA的快速开发插件,为效率而生,下面这篇文章主要给大家介绍了关于IDEA插件之mybatisx插件使用的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • Java 基础语法中的逻辑控制

    Java 基础语法中的逻辑控制

    这篇文章主要介绍了Java 基础语法中的逻辑控制的相关资料,需要的朋友可以参考下面文章内容
    2021-09-09

最新评论